代码之家  ›  专栏  ›  技术社区  ›  chrisonline

数据库文件的FileOutputStream在Android 9上不再工作

  •  0
  • chrisonline  · 技术社区  · 6 年前

    这是在Android 8和更低版本上工作的,但是自从Android 9之后就不再工作了。 我没有得到任何安全或其他相关的例外。
    它完成时没有错误,但数据(数据库)仍然是旧的,有旧的条目。

    以下是我编写数据库文件的方式:

    byte[] buffer = new byte[1024];
    int length;
    while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
    }
    

    input=FileInputStream路径'/storage/emulated/0/appname/backupAuto_180913120029.db' output=FileOutputStream路径'/data/user/0/packagename/databases/data.db'

            output.flush();
            output.close();
            input.close();
    

    更新:
    如果我在从设备写入/还原data.db文件并通过SQLLite工具打开后传输,我会看到正确的数据。
    但应用程序仍然显示旧数据。不管我做什么。

    我正在使用ContentProvider并在getReadableDatabase()中使用,但似乎总是得到一个缓存的或旧的数据库。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Stephen Rauch Afsar Ali    6 年前

    我的答案是:

    Android P - 'SQLite: No Such Table Error' after copying database from assets

    通过将此添加到我的SQLiteOpenHelper解决了此问题:

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        db.disableWriteAheadLogging();
    }
    
        2
  •  0
  •   chrisonline    6 年前

    解决方案而不禁用WAL。

    引入一种特殊的SQLiteDatabase模式,称为 兼容性WAL (预写日志)允许数据库使用“journal_mode=WAL”,同时保持每个数据库最多保持一个连接的行为。

    详情如下:
    https://source.android.com/devices/tech/perf/compatibility-wal

    SQLite WAL模式的详细说明如下:
    https://www.sqlite.org/wal.html

    在正式文档中,WAL模式添加了第二个数据库文件 数据库名称 和“-wal”。因此,如果您的数据库名为“data.db”,则在同一目录中称为“data wal.db”。

    解决方案 两者 Android 9上的文件(data.db和data wal.db)。

    之后,它就和以前的版本一样工作了。