【发布时间】:2013-11-13 06:30:26
【问题描述】:
这个问题只是出于好奇!我在android上实现了一个数据库DB1。但是当我在主要活动中调用方法this.databaselist 时,我看到两个数据库存在DB1 和DB-journal。为什么android会自动创建第二个数据库?在处理多个数据库时,我们是否也需要处理这些期刊数据库?
【问题讨论】:
标签: android eclipse android-sqlite
这个问题只是出于好奇!我在android上实现了一个数据库DB1。但是当我在主要活动中调用方法this.databaselist 时,我看到两个数据库存在DB1 和DB-journal。为什么android会自动创建第二个数据库?在处理多个数据库时,我们是否也需要处理这些期刊数据库?
【问题讨论】:
标签: android eclipse android-sqlite
SQLite 使用临时文件的方式不被视为 SQLite 与应用程序签订的合同的一部分。
journal 是一个临时文件,用于在 SQLite 中实现原子提交和回滚功能。日志始终与数据库文件位于同一目录中,并且与数据库文件具有相同的名称,但附加了 8 个字符 "-journal"。
日志通常在事务首次启动时创建,通常在事务提交或回滚时删除。日志文件对于实现 SQLite 的原子提交和回滚功能至关重要。如果没有日志,SQLite 将无法回滚不完整的事务,并且如果在事务中间发生崩溃或断电,则整个数据库可能会在没有回滚日志的情况下损坏。
日志通常分别在事务的开始和结束时创建和销毁。但是这个规则也有例外。
如果在事务处理过程中发生崩溃或断电,则日志文件将保留在磁盘上。下次另一个应用程序尝试打开数据库文件时,它会注意到废弃的回滚日志(在这种情况下我们称之为“热日志”)的存在,并使用日志中的信息将数据库恢复到之前的状态不完整事务的开始。这就是 SQLite 实现原子提交的方式。
如果应用程序使用 pragma 将 SQLite 置于独占锁定模式:
PRAGMA locking_mode=EXCLUSIVE;
更多详情Check
【讨论】:
您可以选择将日志保存在内存中,这样就不会创建 -journal 文件:
pragma journal_mode=memory;
请注意,每次打开数据库时都需要运行它。
【讨论】: