核心数据 - 重新启动应用

时间:2016-08-17 23:31:39

标签: ios objective-c core-data

我有一个Core Data应用程序,其中包含一个由多个实体组成的模型。出于这个问题的目的,让我们调用模型“Person”并使实体“name”(字符串),“age”(int),“占用”(字符串)和“description”(字符串)。

举个例子,我可以添加一个新人。我设定了他们的名字,年龄,职业和描述。我通过检查NSManagedObjectContextObjectsDidChangeNotification userInfo的内容确认已更新上下文。然后保存上下文并将其持久保存到磁盘(通过记录和查询SQLite数据库确认)。

此时,我可以编辑任何Person对象,并且可以修改,添加,删除等所有实体,并确认所有更改以使用NSManagedObjectContextObjectsDidChangeNotification更改上下文并确认将持久保存到磁盘通过记录和查询SQLite - 一切都按预期工作。

然而,重新启动应用后,“占用”和“描述”不会持续存在。它们未设置为transient(但它们是“可选的”),并且主要上下文在设置后保存(有时多次)。更重要的是,如果我退出应用程序,再次打开它之前,我可以查询SQLite数据库并确认更改仍存在于磁盘上。

当重新打开应用程序时,我可以确认磁盘上的所有内容都与我退出时相同。 然而,当我在App Delegate中初始化Core Data时,NSManagedObjectContextObjectsDidChangeNotification会通知我某些内容已发生变化。出于某种原因,“占领”和“描述”已经消失。它们尚未设置为null,它们已设置为零长度字符串。因此,下次发生触发保存的事件时,“占用”和“描述”被设置为零长度字符串并消失。这一切都发生在启动时 - 我不访问视图控制器或甚至查询这些特定字段的任何其他内容。但是,我确实展示了一个视图控制器,它确实需要一个获取请求来填充显示People对象的UITableView,尽管它没有专门显示任何有问题的实体。

从Person 1到Person 2有一个轻量级的Core Data Model迁移,但是当切换回Person 1时,这个问题仍然存在,这让我相信这不是迁移的问题。

我正在询问有关从何处开始解决此问题的建议。我无法发布代码 - 我不知道在我的应用程序中发生了什么问题。我已经尝试通过确认何时在上下文中发生更改以及如何与磁盘上的内容进行比较来尽可能地进行故障排除,我只是不知道从何处开始。我不知道为什么这些实体(只有其中一些)正在消失。有人会如何开始解决此类问题?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

感谢@Rog和@Avi的指导,我能够为有问题的属性设置自定义设置器并覆盖validateValue:forKey:error,并在每个设置中设置断点。从这里,我能够看到调用方法并正确诊断问题。

实际问题是我误解了在初始化Core Data时为每个对象调用了initWithEntity:insertIntoManagedObjectContext:,我认为它只会在最初创建对象时被调用(一次且只有一次) )。有问题的代码在initWithEntity:insertIntoManagedObjectContext:中。

感谢您的帮助!