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

Posted

技术标签:

【中文标题】保存具有多个不同关系的相同类型的各种核心数据实体?【英文标题】:Saving various core data entities of the same type with multiple different relationships? 【发布时间】:2012-11-27 08:05:56 【问题描述】:

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

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

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

我根本找不到关键字组合来查找是否有人以前问过这个问题。我不明白它怎么会出现,我正在做的是基本的抽象。我一直认为我忽略了一个盒子。

总而言之,我有一个人,一个人有 2 个列表。我添加它们类似于: person.friendEmailsList = 下载的电子邮件来自朋友; person.businessEmailsList = 下载的商业电子邮件;

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

任何建议将不胜感激

【问题讨论】:

原来是一个复选框。不要设置“父” 【参考方案1】:

有两种可能的解决方案。

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

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 访问列表。

【讨论】:

啊,所以分开的逆是正确的方法。不知何故,它捏造了结构,但这可能是由于我的粗心。我也在考虑枚举属性,遵循 SQL 样式键。如果我无法管理数据库,我将使用该方法。回来后我会接受你的答案,暂时无法测试。非常感谢,这似乎是我的用户错误 它是在使用唯一逆方法时创建子类,而不是仅仅创建唯一实体。看来我可能必须执行 fetched 属性方法。我的同事建议 5 个单独的类,每个类都没有唯一类型,只是为了拆分核心数据。这不起作用的事实让我很烦恼,SQL可以将它分开,但核心数据无论如何都将它推到一个表中。我不认为苹果会犯那么大的缺陷,一直认为我做错了。由于该缺陷,我们使用单独的逆运算最终得到了原始类型的 4 倍 这就是为什么我指出这不是概念上最好的方法。问题不在于 Apple,而在于老式的关系数据库思维,而不是拥抱对象图。 啊,好吧。我准备使用对象图,但这需要创建单独的类型吗?还是枚举方法?我意识到这可能是某些书籍/指南中的基础知识,并且完全愿意指出某个地方将解释如何以 Core Data 方式执行此操作。我在核心数据指南中看到的唯一内容是定义逆数。 使用我建议的附加属性。它极大地简化了事物,并代表了一个更接近“现实”的模型,即相同类型的事物只定义一次。

以上是关于保存具有多个不同关系的相同类型的各种核心数据实体?的主要内容,如果未能解决你的问题,请参考以下文章

在关系数据库中对相同实体之间的多个多对多关系进行建模

具有核心数据的多个持久性存储

如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet

保存核心数据相关数据并使用具有多个实体的 NSPredicate 和 NSFetchedResultsController 检索

核心数据需要时间来插入具有获取实体的记录并设置为关系

核心数据不保存一个实体的属性