Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当创建sqlite数据库的备份在android pie中创建旧文件时?_Android_Sqlite_Android Studio_Android Sqlite - Fatal编程技术网

当创建sqlite数据库的备份在android pie中创建旧文件时?

当创建sqlite数据库的备份在android pie中创建旧文件时?,android,sqlite,android-studio,android-sqlite,Android,Sqlite,Android Studio,Android Sqlite,我有用于备份创建本地sqlite文件的代码。API低于28时工作正常,但高于>=28时创建备份文件是一个创建问题。当我创建备份文件时,它是创建旧数据文件,而不是更新的数据,而是在应用程序中显示更新的数据 public void writeBackupOnSD() { try { File newFolder = new File(Environment.getExternalStorageDirectory(), "Account_Manager"); i

我有用于备份创建本地sqlite文件的代码。API低于28时工作正常,但高于>=28时创建备份文件是一个创建问题。当我创建备份文件时,它是创建旧数据文件,而不是更新的数据,而是在应用程序中显示更新的数据

public void writeBackupOnSD() {
    try {
        File newFolder = new File(Environment.getExternalStorageDirectory(), "Account_Manager");
        if (!newFolder.exists()) {
            boolean isCreated = newFolder.mkdir();
            Log.d("File", "status" + isCreated);
        }
        File file = new File(newFolder, backupFileName);//custom file name save on sd


        String outFileName = file.getPath();
        String inputFileName = getApplicationContext().getFilesDir().getPath()+ "/" + AppConstant.DATABASE_NAME;

        if(checkDatabase(inputFileName)) {
            FileInputStream myInput = new FileInputStream(new File(inputFileName));
            FileOutputStream myOutput = new FileOutputStream(outFileName);

            FileChannel src = myInput.getChannel();
            FileChannel dst = myOutput.getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();

            showMessage("Backup successfully!");
        }
    } catch (Exception e) {
        e.printStackTrace();
        showMessage("Failed to backup!");
    }
}

使用Android Pie及以上版本,默认日志记录模式已从日志记录模式更改为WAL(预写日志记录)。 在日志模式下,事务被提交并写入磁盘上的db文件,并在日志中保留它们的记录,从而允许回滚事务

使用WAL时,事务被写入一个单独的文件(db文件后缀为-WAL),WAL文件只是偶尔被写入磁盘(检查点),但可以作为数据库文件的一部分使用。不需要回滚,因为基本上可以删除–wal文件

如果您没有检查数据库(关闭数据库应该检查它),并且您没有备份(和恢复)未检查的数据库以及–wal文件(以及–shm文件),那么您将丢失事务,并且在尝试打开数据库时基本上可能会出现问题。SQLitedatabase open方法然后尝试提供一个可用的数据库,该数据库为空

有多种修复方法:-

使用强制使用日记模式(不建议使用,因为您将失去提供的优势)

备份和恢复-wal和-shm文件以及数据库文件

在备份数据库之前完全检查数据库,因此不需要备份-wal和-shm文件。 -注意:关闭数据库应完全检查数据库。
-这里的答案显示了如何通过编程检查点

您不能任意复制一个打开的、正在使用的sqlite数据库文件,而不会有数据丢失甚至损坏的风险。不幸的是,Android没有导出应该用于以编程方式进行备份的官方备份api对该文件的所有操作和备份只需复制该文件,但仍显示最新的内容,但在复制该文件时,请使用旧数据复制该文件。最好的方法是先正常关闭与数据库文件的所有连接。如果您不能这样做,请提及其他一些选项。谢谢,
disablewriteaheadloging()
是我所需要的。