当前位置: 首页 > 面试题库 >

数据库导入和导出在Android Pie中不起作用

裴心思
2023-03-14
问题内容

以下是导入和导出SQLite数据库的工作方法。它的工作在除Android Pie外的所有android版本中都可以正常工作。当我尝试导入Android
Pie时,它显示成功的Toast,但未还原数据库。谁能帮我解决Android Pie(API 28)问题。

private void importDB() {

    try {
        File sd = Environment.getExternalStorageDirectory();
        File cur_db_pat = new File(this.getDatabasePath(DATABASE_NAME).getAbsolutePath());

        if (sd.canWrite()) {
            String backupDBPath = bac_dir_nam +"/" + DATABASE_NAME;
            File currentDB = new File(sd, backupDBPath);

            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(cur_db_pat).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
            Toast.makeText(getBaseContext(), cur_db_pat.toString(),
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {

        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                .show();

    }
}

private void exportDB() {

    try {
        File sd = Environment.getExternalStorageDirectory();
        File cur_db_pat = new File(this.getDatabasePath(DATABASE_NAME).getAbsolutePath());

        if (sd.canWrite()) {
            String backupDBPath = bac_dir_nam+"/" + DATABASE_NAME;
            File backupDB = new File(sd, backupDBPath);

            FileChannel src = new FileInputStream(cur_db_pat).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
            Toast.makeText(getBaseContext(), backupDB.toString(),
                    Toast.LENGTH_LONG).show();

        }
    } catch (Exception e) {

        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                .show();

    }
}

我对文件系统没有太多经验。因此,举个例子会很有帮助。


问题答案:

在Android Pie +中,SQLite已更改为默认设置,以使用通常更有效的预写日志记录( WAL )代替日记模式。

这样,将有两个与数据库同名的文件,但后缀为 -shm (共享内存文件)和 -wal
写日志),我认为它们的存在是导致此问题的原因。
SQLite使用的临时文件(请参阅2.2和2.3)

一种解决方法是使用SQliteDatabase disableWriteAheadLogging
方法禁用预写日志记录,而先前的html" target="_blank">方法将像以前一样工作,但日志效率较低。

  • (如果使用 SQliteOpenHelper 的子类,则重写 onConfigure 方法以调用此方法。)disableWriteAheadLogging。

另一个修复方法是在还原时删除这两个文件。为了避免潜在的损坏,必须在进行备份之前确保对数据库进行适当的检查。见PRAGMA检查站;

以下是还原时删除这两个文件的摘要(请注意,假定已使用足够的检查点进行了备份):

                    // Added for Android 9+ to delete shm and wal file if they exist
                    File dbshm = new File(dbfile.getPath() + "-shm");
                    File dbwal = new File(dbfile.getPath()+ "-wal");
                    if (dbshm.exists()) {
                        dbshm.delete();
                    }
                    if (dbwal.exists()) {
                        dbwal.delete();
                    }

另一个解决方法是另外备份并随后还原-shm和-wal文件。

您可能还希望考虑在导入/还原时重命名原始文件,在复制新文件后检查新文件的潜在好处(例如,使用 PRAGMA
integrity_check;),如果结果表明没有问题,则删除重命名的原始文件,否则删除导入的文件并将原始文件重命名为其原始名称,表明导入失败。



 类似资料:
  • 这可能是个愚蠢的问题,但我无论如何也无法解决。我有一个JavaScript文件,其中包含我想要导出的各种函数。 当我调用这个方法(使用mocha)时,我得到一条错误消息“export function AddNumbers(…numbers)Unexpected token export”。该项目构建为ES6。有人知道我做错了什么吗? 最好的问候,托斯顿

  • 问题内容: 我正在尝试编写脚本来导入数据库文件。我编写了脚本来导出文件,如下所示: 现在,我希望能够导入该数据库。我试过了 : 但是我不允许执行多个语句。有没有办法让它直接运行SQL脚本? 问题答案: 文件资料。

  • 我想在我的js文件中导入一个函数。下面是一个简单的代码: 谢谢

  • 我尝试使用pg_dump命令导出PostgreSQL数据库(数据库名ari_company): 然后我得到了这个错误: 但当我运行默认数据库(postgres)时,它会工作并转储。sql被创建。使用命令

  • 我试图通过drewnoakes导入元数据提取器库,从正在处理的图像中提取EXIF数据。通用域名格式。我尝试了两种可能的方法来导入库,但它仍然不起作用。 我所做的: 1) 将JAR文件拖放到我的草图中,并使用import语句import com。drew。*;但它仍在抱怨图书馆不存在。 2) 将JAR文件放在My Documents文件夹的Processing文件夹中,并使用“import libr

  • 本文向大家介绍利用PL/SQL从Oracle数据库导出和导入数据,包括了利用PL/SQL从Oracle数据库导出和导入数据的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了使用PL/SQL从Oracle数据库导出和导入数据的方法,供大家参考,具体内容如下 1.导出数据: 方式一:工具—>导出用户对象—>导出.sql文件 注:这种方式导出的是建表语句和存储过程语句 方式二:工具—>导出表