Android SQLite Journal 行为改变了吗?
Android SQLite Journal behaviour changed?
我的想法是,SQLite 日志只会在有未决操作时保留在文件系统中。
然而,在我看来,至少在 Android 4.1+ 中,SQLite 日志的正常行为是保留在文件系统中,即使在将事务设置为成功/结束,甚至关闭之后数据库。
有人知道这种行为改变的原因和时间吗?
显然,Android 版本的默认 journal_mode setting 不同。
@CL 是对的,日志模式似乎会根据 API 级别而改变(也许它也会因制造商而改变?)。
但是,为了将来参考,我在数据库中查询了几个 API 级别的 journal_mode,结果是:
- Android 2.3.7 (API 10) = 删除
- Android 4.0.4 (API 15) = 截断
- Android 4.1.1 (API 16) = 坚持
- Android 4.3.0 (API 18) = 坚持
- Android 4.4.4 (API 19) = 坚持
- Android 5.0.0 (API 21) = 坚持
- Android 5.1.0 (API 22) = 坚持
获取日志模式的代码:
Cursor c = db.rawQuery("PRAGMA journal_mode;", null);
c.moveToFirst();
String journalMode = c.getString(c.getColumnIndex("journal_mode"));
关于日志模式:
DELETE 日记模式是正常行为。在 DELETE 模式下,回滚日志在每个事务结束时被删除。的确,删除操作是导致事务提交的动作。
TRUNCATE 日记模式通过将回滚日志截断为 zero-length 而不是删除它来提交事务。在许多系统上,截断文件比删除文件快得多,因为不需要更改包含目录。
PERSIST 日志模式防止回滚日志在每个事务结束时被删除。相反,日志的 header 被零覆盖。这将防止其他数据库连接回滚日志。 PERSIST 日记模式可用作平台上的优化,在这些平台上,删除或截断文件比用零覆盖文件的第一个块要昂贵得多。
我的想法是,SQLite 日志只会在有未决操作时保留在文件系统中。
然而,在我看来,至少在 Android 4.1+ 中,SQLite 日志的正常行为是保留在文件系统中,即使在将事务设置为成功/结束,甚至关闭之后数据库。
有人知道这种行为改变的原因和时间吗?
显然,Android 版本的默认 journal_mode setting 不同。
@CL 是对的,日志模式似乎会根据 API 级别而改变(也许它也会因制造商而改变?)。
但是,为了将来参考,我在数据库中查询了几个 API 级别的 journal_mode,结果是:
- Android 2.3.7 (API 10) = 删除
- Android 4.0.4 (API 15) = 截断
- Android 4.1.1 (API 16) = 坚持
- Android 4.3.0 (API 18) = 坚持
- Android 4.4.4 (API 19) = 坚持
- Android 5.0.0 (API 21) = 坚持
- Android 5.1.0 (API 22) = 坚持
获取日志模式的代码:
Cursor c = db.rawQuery("PRAGMA journal_mode;", null);
c.moveToFirst();
String journalMode = c.getString(c.getColumnIndex("journal_mode"));
关于日志模式:
DELETE 日记模式是正常行为。在 DELETE 模式下,回滚日志在每个事务结束时被删除。的确,删除操作是导致事务提交的动作。
TRUNCATE 日记模式通过将回滚日志截断为 zero-length 而不是删除它来提交事务。在许多系统上,截断文件比删除文件快得多,因为不需要更改包含目录。
PERSIST 日志模式防止回滚日志在每个事务结束时被删除。相反,日志的 header 被零覆盖。这将防止其他数据库连接回滚日志。 PERSIST 日记模式可用作平台上的优化,在这些平台上,删除或截断文件比用零覆盖文件的第一个块要昂贵得多。