【发布时间】:2019-09-11 02:46:41
【问题描述】:
我有用于备份创建本地 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!");
}
}
【问题讨论】:
-
你不能随意复制一个打开的、正在使用的 sqlite 数据库文件而不会有数据丢失甚至损坏的风险。不幸的是,Android 没有导出应该用于以编程方式进行备份的官方备份 api。
-
我已经在 getFileDir() 中创建了本地文件,并且对该文件进行了所有操作并进行备份,只是复制了该文件,但仍显示最新内容,但是当复制该文件时,该复制文件与旧数据。跨度>
-
最好的办法是先优雅地关闭到数据库文件的所有连接。如果你不能这样做,sqlite.org/… 和 sqlite.org/backup.html 提到一些其他选项。
标签: android sqlite android-studio android-sqlite