保存包含一堆核心数据对象的字典的最佳方法是什么?

时间:2017-07-13 05:12:43

标签: ios objective-c core-data

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

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

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

编辑 - 更多详情

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

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

假设有3个过滤器,过滤器A,B和C,每个过滤器可以有5个不同的值。现在用户可以选择过滤器A1,A2,B1和C3(或不同的组合)。我的问题是,如何使用核心数据保存这些选定的过滤器(在这种情况下为A1,A2,B1和C3)?

2 个答案:

答案 0 :(得分:1)

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

解决方案1:在字典中翻转每个托管对象。

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

这可确保您取消归档时的数据正是您离开时的方式。取消归档后,您将获得COPY数据,如果此后托管对象在数据库中发生了更改,您将获得OLD值。这些副本也不是核心数据对象,因为它们与托管对象上下文无关。

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

使用对象的objectId替换集合中的每个托管对象。这本字典可以轻松存档。取消归档时,在上下文中使用existingObjectWithID:将核心数据对象(如果找到)替换为每个objectId。如果实体已被删除,那么您将无法取回它们。如果实体已更改,那么您将获得新值。

解决方案3:不要执行任何此操作

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

答案 1 :(得分:0)

试试这样:

存档:

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

UNARCHIVE:

 NSDictionary *myData = [NSKeyedUnarchiver unarchiveObjectWithData:yourDictData];