В настоящее время я работаю над реализацией функции резервного копирования SQlite в моем приложении с помощью stream.Когда я делаю резервную копию базы данных, она работает, и файл содержит данные, как я это проверил через «Db browser for SQlite».Но когда я пытаюсь восстановить через FilOuputStream из пути к базе данных моего приложения и InputStream из возвращенного UrI с помощью android SAF (Структура доступа к хранилищу), указывающего на внешнее хранилище, куда я поместил резервную копию базы данных, я получаю поврежденный файл базы данных, и соединение также закрывается.
Ниже приведены два метода, которые я использую для этой цели
Создание резервной копии
//back db to a URI
public synchronized static boolean backupDb(Context context, Uri uri, String dbNam) throws IOException {
File dbFile = new File(context.getDatabasePath(dbNam).getPath());
FileInputStream inFilStream = new FileInputStream(dbFile);
OutputStream outFilStream = context.getContentResolver().openOutputStream(uri);//new FileOutputStream(backupFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inFilStream.read(buffer)) > 0) {
outFilStream.write(buffer, 0, length);
}
outFilStream.flush();
outFilStream.close();
inFilStream.close();
return true;
}
Восстановление резервной копии
//restore db from a URI
public static synchronized boolean restoreBackup(Context context, Uri uri, String dbNam) {
try {
InputStream inFilStream = context.getContentResolver().openInputStream(uri);
File dbFile = new File(context.getDatabasePath(dbNam).getPath());
FileOutputStream outFilStream = new FileOutputStream(dbFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inFilStream.read(buffer)) > 0) {
outFilStream.write(buffer, 0, length);
Log.wtf("db", "restoring backup up");
}
outFilStream.flush();
// using outFilStream.getFD().sync(); also not working
outFilStream.close();
inFilStream.close();
return true;
} catch (IOException e) {
return false;
}
}
Журнал
Я не понимаю, почему это происходит, потому что довольно странно, когда я отлаживаю и ставлю точки останова в методе восстановления, который работает, может кто-нибудь помочьвыяснить, что там не так.