可以停止在 sqlite 数据库 android 中创建 .db-shm 和 .db-wal 文件吗?

Posted

技术标签:

【中文标题】可以停止在 sqlite 数据库 android 中创建 .db-shm 和 .db-wal 文件吗?【英文标题】:it is possible to stop creating .db-shm and .db-wal files in sqlite database android? 【发布时间】:2021-11-13 21:12:45 【问题描述】:

我想停止创建 .db-shm.db-wal 文件。我只想要我的数据目录的数据库文件夹中的.db 文件。

一些旧设备生成.db-shm.db-wal,而一些最新设备生成.db-journal

当我尝试备份/恢复我的数据库文件时,这会产生问题。

我想知道是否可以通过android中的代码来实现?

【问题讨论】:

【参考方案1】:

我想知道是否可以通过android中的代码来实现?

是的,这是可能的。

您可以使用 SQLiteDatabase 的 disableWriteAheadLogging 强制日志模式(这使用 -journal 文件,但在日志模式下,附加文件包含所做更改的日志,因此不需要该文件(仅用于回滚))方法(如果使用 SQLiteOpenHelper 的子类,我建议在 onOpen 方法中执行此操作。)

您还可以使用 SQLite 的 journal_mode PRAGMA(如果使用 SQLiteOpenHelper 的子类,我再次建议在 onOpen 方法中使用。)

另一种选择是保持 WAL 模式,但要确保数据库是完全检查点的。关闭数据库应该完全检查数据库,然后如果-wal文件仍然存在,它应该是空的,在这种情况下不需要。

我建议这是更好的选择。它适用于 WAL 或 JOURNAL 模式和单个备份文件。

还有保存 -wal 和 -shm 文件的选项。

【讨论】:

我检查了 WAL 是否已启用,db..isWriteAheadLoggingEnabled() 表示 WAL 文件已禁用,但是当我检查应用程序数据目录中的数据库文件夹时仍然存在 @Milan.Tejani -wal 文件是空的吗? (0字节)如果是这样,它可能只是因为它以前存在而存在,有效地如果它是空的,它就没有用并且在恢复时不应该引起任何问题。【参考方案2】:

是的,可以停止创建 .wal.shm 文件。观察到的一件事是,直到 Android 9 版本,系统使用原始 .db 文件创建 .wal.shm 并在 Android 10 或此类文件的最新版本不存在,但有一个名为 .journal 的新文件。

要停止创建 .wal.shm 等文件,只需在 SQLite 帮助器类中添加方法...

@Override
    public void onOpen(SQLiteDatabase db) 

        super.onOpen(db);
        db.disableWriteAheadLogging();

我已经通过这种方式解决了问题,并且肯定也适用于您的情况。

【讨论】:

以上是关于可以停止在 sqlite 数据库 android 中创建 .db-shm 和 .db-wal 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中创建SQLite数据库

Android:正确停止异步任务

无法存储android设备的位置并将其存储在sqlite中

如何使用Android从sqlite中的表中删除所有记录?

Android SQLite详解

Android SQLite详解