如果用户请求恢复数据,则使用“ FileInputStream”和“ FileOutputStream”从内部SD卡恢复到apps数据目录。
此功能可在Android 8及更低版本上运行,但由于Android 9不再可用。
我没有任何安全性或其他相关异常。
结束时没有错误,但是数据(数据库)仍然是具有较旧条目的旧数据。
这是我写数据库文件的方式:
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
input =路径'/storage/emulated/0/appname/backupAuto_180913120029.db'的FileInputStream 输出=路径'/data/user/0/packagename/databases/data.db'的FileOutputStream
output.flush();
output.close();
input.close();
更新:
如果从设备写入/恢复data.db文件后进行传输并通过SQLLite工具将其打开,我会看到正确的数据。
但是该应用仍会显示旧数据。不管我做什么。
我正在使用ContentProvider并在getReadableDatabase()中使用,但看来我总是得到缓存或旧数据库。
答案 0 :(得分:3)
我在以下位置找到答案:
Android P - 'SQLite: No Such Table Error' after copying database from assets
通过将其添加到我的SQLiteOpenHelper中解决了该问题:
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
db.disableWriteAheadLogging();
}
答案 1 :(得分:0)
无需禁用WAL的解决方案。
Android 9 引入了一种称为 Compatibility WAL (预写登录)的特殊SQLiteDatabase模式,该模式允许数据库使用“ journal_mode = WAL”,同时保留以下行为:每个数据库最多保留一个连接。
详细信息在这里:
https://source.android.com/devices/tech/perf/compatibility-wal
此处详细说明了SQLite WAL模式:
https://www.sqlite.org/wal.html
从官方文档开始,WAL模式将添加另一个名为 databasename 和“ -wal”的数据库文件。因此,如果您的数据库名为“ data.db”,则在同一目录中将其称为“ data-wal.db”。
解决方案现在是在Android 9上保存和还原 BOTH 文件(data.db和data-wal.db)。
此后,它将像早期版本一样工作。