【问题标题】:Best way to save a dictionary containing bunch of Core Data objects?保存包含一堆核心数据对象的字典的最佳方法是什么?
【发布时间】:2017-07-13 17:26:02
【问题描述】:

我希望保存一个包含一些核心数据对象(一组不同的实体)的字典。这些对象还定义了很多关系(和反向关系)。最好的方法是什么?

我尝试使用NSKeyedArchiver 并写入文件。虽然效果很好,但当尝试使用 NSKeyedUnarchiver 从文件中读取时,它在其中一个类上失败并出现错误

-[SomeEntity initWithCoder:]: unrecognized selector sent to instance

编辑 - 更多详情

我有一堆对象,每个对象都有可以过滤的属性。这些属性本身就是核心数据实体对象,因为它们具有复杂的结构。

我希望保存用户选择的过滤器,以便他们下次查看对象时,可以根据他们之前的选择过滤对象。

假设有 3 个过滤器,过滤器 A、B 和 C,每个过滤器可以有 5 个不同的值。现在用户可以选择过滤器 A1、A2、B1 和 C3(或不同的组合)。我的问题是,如何使用 Core Data 保存这些选定的过滤器(本例中为 A1、A2、B1 和 C3)?

【问题讨论】:

  • 它失败的类必须是你自定义的类。这意味着您必须实现这两个方法 initWithCoder: 和 encodeWithCoder: 才能正确归档和取消归档它们。一旦你实现了它们,你应该不会再收到这个错误了。
  • @Pochi 在这种情况下,为什么存档会顺利进行?那不也应该失败吗?

标签: ios objective-c core-data


【解决方案1】:

让我看看我是否理解您的问题:您有一个已保存在上下文中的 managedObjects 集合。它们可能已经保存在 SQL 数据库中。您还想将该集合保存到另一个文件以用于其他目的。您已经考虑以某种方式将此集合的信息保存在 core-data 中,并且已经拒绝了它。您还考虑过简单地保存查询生成令牌以保存数据库当前的状态,但这也不是您想要的。关键是要有一个包含一些 managedObjects 的副本的文件,其组织方式使您可以在不使用专门为此目的设计的 SQL 数据库的情况下取回数据。

解决方案1:将每个托管对象转成字典。

您可以通过获取托管对象的entity 然后访问attributesByNamerelationshipsByName 实体的属性。从那里您可以创建一个简单的循环来将每个属性放入字典中。我还建议您在对关系进行编码时存储 objectID 并指向 objectID。然后将字典中的 managedObject 替换为包含所有属性和关系的字典。这本新词典应该易于归档和取消归档。

这可确保您取消归档时的数据与您离开时的数据完全相同。当您取消归档时,您将获得一份数据副本,如果自那时起您的数据库中的托管对象发生了更改,您将获得旧值。这些副本也不是核心数据对象,因为它们未连接到托管对象上下文。

解决方案 2:只需保存托管对象的 ObjectId。

用对象的 objectId 替换集合中的每个托管对象。这本词典可以很容易地存档。当您取消归档时,它会在上下文中使用 existingObjectWithID: 将每个 objectId 替换为核心数据对象(如果找到)。如果实体已被删除,那么您将无法取回它们。如果实体发生了变化,那么您将获得新的值。

解决方案 3:不要这样做

在我看来,您可能不知道核心数据已经保存在数据库中。如果您有一些 managedObjects 集合,您应该能够从您的数据库中重新创建它。如果你不能这样做,那么你应该添加允许你这样做的属性和/或关系。

【讨论】:

  • 谢谢,这几乎概括了我的需要。是的,我确实在核心数据数据库中有数据。这里的问题是字典有一组不同的实体对象 - 所以它有 SomeEntity1、SomeEntity2 ......有时它可能只有一个 SomeEntity1 对象和 SomeEntity2 3 个对象。它是动态构建的。 TBH 由于这种动态特性,我不知道如何将它们保存到 CoreData 中。如果您能帮助我,我将不胜感激!
  • 没有详细的建议很难。
  • 我已经编辑了这个问题,以防万一。谢谢。
  • 阅读详细信息后,选项 3 是正确的。将其保存为字典将保存过时的信息。保存 objectID 不会显示进入该过滤器的新数据。如果要保存最后选择的过滤器值,则只需保存最后选择的过滤器值。将信息保存在 userDefaults 中。它很小,没有理由让你的核心数据模型复杂化。这是 userDefaults 的用途。
【解决方案2】:

试试这样:

存档:

 NSDictionary *yourDictData = [NSDictionary dictionaryWithObject:json forKey:@"key"]; // This is for example. Here you have to replace ur dictionary
 NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:yourDictData];

取消存档:

 NSDictionary *myData = [NSKeyedUnarchiver unarchiveObjectWithData:yourDictData];

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2021-10-23
  • 2012-07-20
  • 2018-06-16
相关资源
最近更新 更多