保存具有多个不同关系的相同类型的各种核心数据实体?
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 检索