android - 在 Android Pie 中禁用 sqlite 预写日志记录

标签 android sqlite wal sqldroid

在 Android Pie 中,sqlite 预写日志记录 (WAL) 已默认启用。这导致我现有的代码仅在 Pie 设备中出错。 由于我访问数据库的方式,我无法使用 SQLiteDatabase.disableWriteAheadLogging()PRAGMA journal_mode 成功关闭 WAL。我想使用名为 db_compatibility_wal_supported 的 Android 设置完全禁用 WAL:

Compatibility WAL (Write-Ahead Logging) for Apps

有人知道怎么设置吗?我不知道这个文件是否可以在启动时以编程方式更改,或者是否可以手动更改。


关于问题的更多细节

我的应用程序中有一个 sqlite 数据库(20mb+/250k 条记录)。这个数据库是在我的服务器上使用纯 java 生成的。它包含一个食物数据库,应用程序的用户可以添加到数据库(并且服务器已更新)。这个保存在android的assets文件夹中。 在第一次安装过程中,数据库从 assets 复制到 app 文件夹,以便可以写入,有效地使用此方法:

Copy SQLite database from assets folder

不幸的是,一旦我开始使用 SqlDroid wal 写入数据库,原始数据库中的表就消失了,只剩下新创建的表。然而,数据库的大小仍然是 20mb 以上。所有数据库错误都是由于缺少表造成的。 表格复制和写入方法在 Pie 之前的 Android 版本中完美运行。

最佳答案

在数据库中禁用 WAL 模式的最好和最简单的方法如下:

public class MyDbHelper extends SQLiteOpenHelper {

    //...

    @Override
    public void onOpen(SQLiteDatabase db) {
        db.disableWriteAheadLogging();  // Here the solution
        super.onOpen(db);
    }

    //...
}

这样,所有对数据库的访问都将禁用 WAL 模式。在应用程序的整个实现过程中打开和关闭多个连接

关于android - 在 Android Pie 中禁用 sqlite 预写日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53659206/

相关文章:

android - 如何在 android 中为 SQLite 启用 Write-Ahead Log(WAL) 日志模式?

java - 在打开新 Activity 之前等待旋转动画在 Android 中完成?

java - SQLiteOpenHelper onUpgrade 被多次调用

qt - qt sqlite select语句

php - 在PHP中序列化与SQLite

postgresql - 找不到wal备份文件

sqlite - 系统崩溃时如何在WAL模式下恢复Sqlite3

android - 使用矩阵旋转位图

java - 无限嵌套的评论。如何维护堆栈历史记录?

android - react native : Handle silent push notification