FileOutputStream wit数据库文件在Android 9上不再起作用

时间:2018-09-13 13:33:45

标签: android fileinputstream fileoutputstream

如果用户请求恢复数据,则使用“ 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()中使用,但看来我总是得到缓存或旧数据库。

2 个答案:

答案 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)。

此后,它将像早期版本一样工作。