核心数据/SQLite 存储偶尔数据丢失

Posted

技术标签:

【中文标题】核心数据/SQLite 存储偶尔数据丢失【英文标题】:Core Data/SQLite Store Occasional Data Loss 【发布时间】:2017-01-17 20:45:23 【问题描述】:

这个问题不常见而且是间歇性的,但非常麻烦。

我有一个使用 CoreData 和 sqlite 持久存储的应用程序,并且 [大多数时间] 可以完美运行。但是,我偶尔会收到我找不到的数据丢失报告。

当核心数据项发生更改时,我们通过调用以下命令将其持久化:

- (void) saveContext

    if ([context hasChanges])
    
        NSError *error = nil;
        if (![context save:&error])
        
            NSLog(@"Failed to save context: %@", error);
            [self displayValidationError:error];
        
    

我的问题集中在,考虑到内容的保存,一旦调用此方法,它是否是最终的,或者其中一些可能被缓存并可能丢失。

我们不确定,但当应用程序在输入一系列项目后进入后台时,似乎会出现此问题。如果应用程序被用户强行终止,我们肯定会导致数据丢失。似乎当用户将应用程序暂时保持不动并且可能将设备用于其他用途时会发生这种情况。

我从 AppDelegate(applicationwillTerminate 和 applicationWillResignActive)调用 saveContext。

所以,我的问题:

来自 AppDelegate 的调用是否足以确保持久性? 当调用 saveContext(如上所示)时,是否需要其他东西来保证所有未保存的实体都刷新到磁盘? 我是否忽略了可能导致此问题的某些因素?

TIA 寻求有关该主题的任何帮助。我几乎找不到与我的问题相似的东西。

【问题讨论】:

【参考方案1】:

来自 AppDelegate 的调用是否足以确保持久性?

不保证会调用applicationWillTerminate。如果您的应用有未保存的数据并且 ios 终止了该应用(因为它已在后台运行了一段时间),则您不能依赖该方法。

当调用 saveContext(如上所示)时,是否需要其他东西来保证所有未保存的实体都刷新到磁盘?

没有“对持久存储进行刷新更改”调用。保存就是了,但你需要在适当的时候保存。

您真的应该保存更改只要您有不想丢失的数据。依赖系统事件意味着您将留下未保存的更改,嗯,可能很长时间未保存。如果您有想要保留的更改,请在完成后立即保存。

【讨论】:

以上是关于核心数据/SQLite 存储偶尔数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

将 Core Data 数据库保存到 sqlite 文件会丢失一些递归/循环关系信息

如果 sqlite DB 未关闭,是不是有可能丢失数据?

当连接未正确关闭时,为啥使用 WAL 模式的 SQLite 数据库中的数据会丢失?

KafkaKafka写入的数据不丢失原理

我有 3 行的 SQLite 数据库,当我从行中删除数据时,数据会丢失但行仍然会,我怎样才能删除那个空白行?

日积月累--exception记录