iOS核心数据损坏?

Posted

技术标签:

【中文标题】iOS核心数据损坏?【英文标题】:iOS core data corruption? 【发布时间】:2010-10-28 13:11:54 【问题描述】:

这是一个相当笼统的问题,因为我没有任何确凿的证据。

我有一个拥有大约 20,000 名用户的 iPhone 应用程序。它允许用户相互发送消息,并将这些消息保存在核心数据中。它保存在核心数据中的唯一另一件事是用户配置文件、本地副本和服务器上的副本。

我有一小部分用户抱怨他们收到消息但没有显示,当他们发送消息(立即进入核心数据然后显示在屏幕上)时,它立即消失。似乎只有完全恢复才能修复它,据我所知,即使是涉及他们恢复刚刚制作的备份的恢复也无法修复它。

我的第一个想法是核心数据一定以某种方式损坏了......但他们尝试发送的消息实际上确实发送了,如果他们的本地配置文件也损坏了,这将是不可能的。

我从来没有能够重新创建它,也没有找到任何面对面遇到过类似问题的人。

是否有人对核心数据中可能出现的可能导致此类情况的情况有任何建议,以便我可以开始尝试找出问题所在?我估计大约 1% 的用户会发生这种情况。

再次抱歉,问题笼统,但这就是我现在必须处理的全部内容!

谢谢

** 编辑

只是澄清一下,删除应用程序并重新安装它并不能在发生这种情况时解决问题。

** 编辑

我刚刚从遇到问题的用户那里获得了更多信息......我的应用程序保存在核心数据中的信息在应用程序被删除并重新安装后仍然存在,所有这些。去年,我在无数不同的设备上删除并重新安装了我的应用程序数百次,每次删除和重新安装时,存储在核心数据中的所有以前的数据都会被完全删除.. 然而对于这些用户来说,这没有发生。这听起来像是基本上需要恢复的 iPhone 问题吗?

** 2010 年 3 月 12 日编辑

终于!我有一些真正可靠的信息要处理。我在我的最新版本中添加了 Flurry,这样我就可以跟踪任何核心数据错误消息,并且能够将收到的错误与我知道的用户 ID 相关联,因为事实是遇到了问题......

错误是:“Msg: Error Domain=NSCocoaErrorDomain Code=133020 '操作无法完成。(Cocoa 错误 133020。)' UserInfo=0x39c7c0 conflictList=('NSMergeConflict (0x39c700) for NSManagedObject (0x38ad00)与 objectID '0x375c30

不幸的是,错误已被修整。 Flurry 必须限制它可以传递的消息的大小。

我现在无法访问我的 mac 和代码,我将在我访问后立即开始调查,并返回一些源代码和我的任何发现。

【问题讨论】:

【参考方案1】:

我现在遇到了这样的问题。到目前为止,我已经发现在两个 NSManagedObjectContext-s 中修改了同一个对象。对象X(至少)有两个持久属性a和b,一个线程改变a,另一个线程改变b,CoreData不能合并。

错误消息中的关键短语是NSMergeConflict

Error Domain=NSCocoaErrorDomain Code=133020 "操作无法完成。(Cocoa 错误 133020.)" UserInfo=0x1544c7d0 conflictList=( "NSMergeConflict (0xc489f40) 用于对象 ID 为 '0xd82b7c 的 NSManagedObject (0xd833ca0)​​...

不确定这是否真的有帮助,但至少它可以告诉您可能出现的问题...

【讨论】:

【参考方案2】:

是否有人对核心数据中可能导致这种情况的情况有任何建议,以便我可以开始尝试追踪问题?

关于无数不同的事情。

您真正的问题是您试图以推测的方式进行调试。 要正确修复此错误,您首先需要知道如何重现该错误。在您尝试某事之后,没有其他方法可以知道您是否已修复它。

我不会首先责备像 Core Data 这样的底层框架。赔率是您的程序是丢失数据的程序。从这个假设开始。

【讨论】:

“我的第一个想法是核心数据一定是在某种程度上损坏了......但是他们尝试发送的消息实际上确实发送了,如果他们的本地配置文件也损坏了,这将是不可能的。” ...我并不是要责怪底层框架。我希望得到一些关于什么会导致我的核心数据中的数据被搞砸的建议,例如,如果我的代码正在访问核心数据并且电池没电了,它会处理它吗?如果我知道核心数据中的任何漏洞通常会导致问题,那么我可以尝试重现错误并修复它 @Steven 几乎不可能帮助您解决问题。您的第一步必须始终是弄清楚如何在修复错误之前重现错误。世界上所有的猜测都可能是浪费时间。 我同意投机并不是最好的开始,但有时这就是你必须继续下去的全部!我已经能够从一个有用的用户那里找到更多信息,我正在编辑上述问题以包含它。谢谢【参考方案3】:

从他们设置帐户的那一刻起,它是否会影响这些用户?这可能与他们的用户名/ID/个人信息有关吗?

如果完全删除应用程序并重新安装不能解决问题,那么我不知道它怎么可能是核心数据 - 正如你自己所说,我经常这样做,它每次都会删除所有核心数据。因此,如果是核心数据损坏,则必须是在您构建核心数据而不是数据库本身。我不认为只有安装您的应用程序的人会遇到保留核心数据的问题。

如果您与遇到此问题的用户联系,我会让他们尝试创建一个“安全且正常”的新用户名。

祝你好运。

【讨论】:

抱歉,我出差几天了,回复慢!不,从创建帐户的那一刻起,它就不会影响用户。他们创建了自己的帐户并且一切都很好,几周甚至几个月,然后突然出现问题。该应用程序联系服务器,将新消息下载到核心数据中,然后无法从核心数据中检索它们。然后所有其他症状都如所述出现(删除应用程序时数据未从核心数据中删除等)。我已经创建了具有完全相同详细信息的帐户,甚至将他们的消息下载到我的设备上,但一切正常! 他们的设备内存不足吗?核心数据文件可能会以块的形式增长——如果设备没有足够的内存进行分配,我不知道会发生什么。听起来可能是罪魁祸首。当您进行测试时 - 您是否将他们的整个 Core-Data 数据库下载到您的设备上?或者只有导致悲伤的消息 - 也可能是数据库大小的限制。但如果只是文字,我看不到这种情况真的发生了。

以上是关于iOS核心数据损坏?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据“数据库出现损坏”——导致此错误的原因是啥?

己亥清爽恢复系列之数据文件3篇:非核心数据文件物理损坏或丢失(无备份恢复)

GDB核心转储具有损坏的堆栈,显示“堆栈帧无法访问地址0x12处的内存”

如何提高 iPhone 上的核心数据获取性能?

iOS - 核心数据 - 完成处理程序

iOS - 数据保存一次到核心数据中