保存具有多种不同关系的相同类型的各种核心数据实体?

时间:2012-11-27 08:05:56

标签: core-data

我一直试图调试这个2个小时,不得不睡觉。首先,我搜索并发现许多类似的帖子与他们的关键字:许多实体相同的类型,这一个: Core Data: inverse relationship for two relationships with same type

但无济于事。这是发生了什么: 我有两种类型的数据模型。例如,我有一个人,那个人可以有4个电子邮件列表。电子邮件类型是它自己的东西,所以我让这个人为每个列表存储4个不同的集合(关系)。

基本上,当我检索一组时,它会抓取所有这些。所有4个列表现在都是1,似乎我设置反转似乎并不重要。实际上这些变化以某种方式导致整个事情没有保存任何东西,下载时所有零对象。在此之前,它工作正常(除了将所有4个列表推入一组)。我更新的只是关系的数据模型。我可能以错误的顺序导出文件,但不知道这是否相关。

我根本无法找到关键字组合来查找是否有人之前询问过这个问题。我不知道它怎么会出现,我正在做的是基本的抽象。我一直在想我忽略了一个盒子。

总结一下,我有一个人,而且有两个人。我添加它们类似于: person.friendEmailsList = downloadedEmailsFromFriends; person.businessEmailsList = downloadedBusinessEmails;

所以后来,我访问person.friendEmailsList(当然使用正确的核心数据调用),而不是只获得朋友,我得到了一切......朋友,企业的一切

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:2)

有两种可能的解决方案。

首先,您可以使用您使用的方法。只需确保您还具有与其他实体相对应的反向关系。因此,如果您与同一实体有2个关系,则该实体需要返回2个不同的关系。 E.g。

Person.friendsLists --->> List
Person.businessLists --->> List

List.friendPerson ---> Person
List.businessPerson ---> Person

更灵活的方法是让列表具有额外的属性type(可以是某种enum的数字。

typedef enum {Friend = 1, Business } ListType;

您可以将其放入List.h文件中。现在,要访问朋友列表,您可以执行此操作:

NSSet *friendList = [person.lists filteredSetUsingPredicate:
       [NSPredicate predicateWithFormat:@"type = %@", @(Friend)]];

这可能有点类型,所以你可以通过将一个访问器方法放入Person.m(在.h中声明)来简化:

-(NSSet*)friendsLists {
    return [person.lists filteredSetUsingPredicate:
       [NSPredicate predicateWithFormat:@"type = %@", @(Friend)]];
}

现在,您可以使用通常方便的person.friendsLists访问列表。