Android 在断电期间,SQLite将数据库回滚到开始之前的某个点

Android 在断电期间,SQLite将数据库回滚到开始之前的某个点,android,sqlite,android-ndk,Android,Sqlite,Android Ndk,我的应用程序中有一个SQLite数据库。每次应用程序修改/添加数据库中的行时,应用程序都会通过发出命令BEING transaction显式启动SQLite事务。更新/添加数据库中的数据后,如果更新失败,我会发出命令COMMIT,或者ROLLBACK。常用的东西()。在我断电之前,一切正常 问题是每次我在应用程序执行COMMIT、启动设备并最终启动应用程序后断电时,SQLITE都会保留数据,就好像BEGIN和COMMIT从未发生过一样!为什么? 我还检查了我的应用程序目录中的数据库文件,它有正确

我的应用程序中有一个SQLite数据库。每次应用程序修改/添加数据库中的行时,应用程序都会通过发出命令
BEING transaction
显式启动SQLite事务。更新/添加数据库中的数据后,如果更新失败,我会发出命令
COMMIT
,或者
ROLLBACK
。常用的东西()。在我断电之前,一切正常

问题是每次我在应用程序执行
COMMIT
、启动设备并最终启动应用程序后断电时,SQLITE都会保留数据,就好像
BEGIN
COMMIT
从未发生过一样!为什么?

我还检查了我的应用程序目录中的数据库文件,它有正确的数据。我还注意到在我的应用程序目录中有一个额外的文件
-journal
。经过检查,这是SQLite用来支持回滚不完整事务的方法,尤其是在断电期间


同样,我的
COMMIT
发生在断电之前。我的数据库文件(在我的应用程序目录中选中)包含正确的数据。但是为什么
-journal
包含较旧的数据呢?我一点也不明白。我在这里遗漏了什么吗?

您的数据库使用的是
PRAGMA synchronous
PRAGMA journal\u mode
的哪些设置?这些可以用来控制sqlite在这些方面的精确行为

包含旧内容的
-journal
文件的行为听起来像这里描述的回滚日志:

当一个进程想要更改一个数据库文件(并且它没有处于WAL模式)时,它首先在回滚日志中记录原始的未更改的数据库内容。回滚日志是一个普通磁盘文件,它始终位于与数据库文件相同的目录或文件夹中,并且与数据库文件具有相同的名称,并添加了-journal后缀。[……]

[……]

如果需要回滚日志以恢复其数据库的完整性,则称回滚日志为热日志。当进程处于数据库更新的中间,程序或操作系统崩溃或断电阻止更新完成时,创建热日志。热日志是一种例外情况。存在热日志以从崩溃和电源故障中恢复。如果一切正常(也就是说,如果没有崩溃或电源故障),你将永远不会得到一份热门日志

可设置的不同日记账模式如下所述:

删除日志记录模式是正常行为。在删除模式下,在每个事务结束时删除回滚日志。实际上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为的文档。)

您可以尝试为
PRAGMA synchronous
设置其他设置,请参见以下设置:

  • 额外(3) “额外同步”与“完全同步”类似,它增加了一个功能,即在取消包含回滚日志的目录的链接以在删除模式下提交事务之后,对该目录进行同步。如果提交之后紧接着断电,EXTRA提供额外的耐久性

  • 全部(2) 当synchronous已满(2)时,SQLite数据库引擎将使用VFS的xSync方法,以确保在继续之前将所有内容安全地写入磁盘表面。这可确保操作系统崩溃或电源故障不会损坏数据库。完全同步是非常安全的,但速度也较慢。当不处于WAL模式时,FULL是最常用的同步设置

因此,在您的情况下,设置
PRAGMA synchronous=EXTRA可能会执行您想要的操作,但这可能会以性能为代价


您还可以尝试使用
PRAGMA journal\u mode=WAL,如中所述,如果在断电时对您更有效,则使用较轻的
PRAGMA synchronous设置
数据库使用的
PRAGMA synchronous
PRAGMA journal\u模式
有哪些设置?这些可以用来控制sqlite在这些方面的精确行为

包含旧内容的
-journal
文件的行为听起来像这里描述的回滚日志:

当一个进程想要更改一个数据库文件(并且它没有处于WAL模式)时,它首先在回滚日志中记录原始的未更改的数据库内容。回滚日志是一个普通磁盘文件,它始终位于与数据库文件相同的目录或文件夹中,并且与数据库文件具有相同的名称,并添加了-journal后缀。[……]

[……]

如果需要回滚日志以恢复其数据库的完整性,则称回滚日志为热日志。当进程处于数据库更新的中间,程序或操作系统崩溃或断电阻止更新完成时,创建热日志。热日志是一种例外情况。存在热日志以从崩溃和电源故障中恢复。如果一切正常(也就是说,如果没有崩溃或电源故障),你将永远不会得到一份热门日志

可设置的不同日记账模式如下所述:

删除日志记录模式是正常行为。在删除模式下,在每个事务结束时删除回滚日志。实际上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为的文档。)

您可以尝试为
PRAGMA synchronous
设置其他设置,请参见以下设置:

  • 额外(3) “额外同步”与“完全同步”类似,它增加了一个功能,即在取消包含回滚日志的目录的链接以在删除模式下提交事务之后,对该目录进行同步。