我正在尝试导出我的 SQLite 数据库,以便在重新安装后将其导入作为备份,但每次导出都成功,但是当我在重新安装应用程序后想要导入该文件时,它没有出现在目录中我无法到达它,尽管如果我导出和导入而无需再次卸载并重新安装应用程序,则导入方法运行良好。
此外,当我使用 (file.existes) 时,它显示它已存在,但尽管它不导入任何内容。 希望我能从你那里找到解决方案。
这是我的导出方法
public boolean exportDB() {
StorageManager storageManager = (StorageManager) context.getSystemService(STORAGE_SERVICE);
StorageVolume storageVolume = storageManager.getStorageVolumes().get(0);
File folder = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R)
folder = new File(storageVolume.getDirectory().getPath() + "/Documents");
boolean success = true;
assert folder != null;
if (!folder.exists())
success = folder.mkdirs();
if (success) {
DirectoryName = folder.getPath() + File.separator + "MMS-" + new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss", Locale.ENGLISH).format(new Date());
folder = new File(DirectoryName);
if (!folder.exists())
success = folder.mkdirs();
if (success)
try {
File dbFile = new File(context.getDatabasePath(DATABASE_NAME).getAbsolutePath());
FileInputStream fis = new FileInputStream(dbFile);
String outFileName = DirectoryName + File.separator + DATABASE_NAME ;
OutputStream output = Files.newOutputStream(Paths.get(outFileName));
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0)
output.write(buffer, 0, length);
output.flush();
output.close();
fis.close();
} catch (IOException e) {
success = false;
}
} else
Toast.makeText(context, "Cannot create folder.", Toast.LENGTH_SHORT).show();
return success;
}
这就是导入方法
public boolean importDB(String dbPath) throws IOException {
String DB_FILEPATH = context.getDatabasePath(DATABASE_NAME).getAbsolutePath();
close();
File newDb = new File(dbPath);
File oldDb = new File(DB_FILEPATH);
if (newDb.exists()) {
FileInputStream fromFile = new FileInputStream(newDb);
FileOutputStream toFile = new FileOutputStream(oldDb);
FileChannel fromChannel = null;
FileChannel toChannel = null;
try {
fromChannel = fromFile.getChannel();
toChannel = toFile.getChannel();
fromChannel.transferTo(0, fromChannel.size(), toChannel);
} finally {
try {
if (fromChannel != null)
fromChannel.close();
} finally {
if (toChannel != null)
toChannel.close();
}
}
getWritableDatabase().close();
return true;
}
return false;
}
您只能访问您的应用程序安装创建的
Documents/
中的文件。在您的情况下,可能是您以前的应用程序安装创建了该文件,因此您的新应用程序安装无法访问它。
不要对存储卷和路径做出假设,而是使用存储访问框架来允许用户决定您的应用程序应将备份放在哪里。您可以使用
ACTION_CREATE_DOCUMENT
/ ActivityResultContracts.CreateDocument
进行备份。您可以使用 ACTION_OPEN_DOCUMENT
/ ActivityResultContracts.OpenDocument
进行恢复操作。我在这本免费书的本章中演示了如何在 Room 的上下文中使用 SQLite 数据库来做到这一点。