CoreData 引用
Posted
技术标签:
【中文标题】CoreData 引用【英文标题】:CoreData referencing 【发布时间】:2010-10-03 15:36:02 【问题描述】:我的应用程序基于 CoreData,但它们可能是所有关系数据库的通用理论:
我的模型中有一个“输出-输入”对多的关系。每个实体在此关系下可能有无限数量的链接。识别特定输入或输出的最佳方法是什么?
到目前为止,我实现这一目标的唯一方法是将一个中间实体放置在可以保存输出和输入名称的关系中。然后,实体可以在需要时循环其输入/输出以找到正确的关系。有没有更好的办法?
实际上,我正在尝试提供一个通用实体,它可以与其他通用实体有任意数量的关系。
抱歉,如果我的描述不是最清楚。
根据以下答案进行编辑: 首先感谢您的回复。我当然有一个双向太多的关系。但是,如果一个小部件有 2 个其他小部件链接到它的 Inputs 关系,那么确定哪个输入提供的最佳方法是什么,比如“年龄”或“服务年限”,当两者都可能具有此属性但我只对特定感兴趣时每个人的价值?
【问题讨论】:
【参考方案1】:我和 Joshua 一样困惑 - 这告诉我,您可能没有清楚地了解您想要实现的目标,或者它有些复杂(两者都有?)。
我最好的猜测是你有类似的东西:
实体小部件 属性:
标识符关系
outputWidgets > 小部件 inputWidgets > 小部件(根据标准,a ->> 是一对多关系,> 是一对多关系和一对多反向关系)。
因此,每个小部件都将存储它作为输出的小部件集和作为输入的小部件集。
因此,特定的小部件维护一组 inputWidgets 和 outputWidgets。这些关系中的每一个也都是相反的,因此您可以 - 对于输入或输出中的任何小部件 - 查看您的小部件是否在其输入或输出列表中。
不过这太丑了。
我认为您的问题是如何在标记关系的同时实现上述目标。您提到您希望每个关系都有一个字符串标识符(唯一的?)。
您可以通过以下方式做到这一点:
为每个双边关系创建一个新的 widgetNamedRelationship。请注意,我假设每个关系都是双面的。
然后,对于每个小部件,您都有一组命名输入和命名输出。这也允许将小部件附加到自身,但只有单独的输入和输出总线。
那么对于你的实现类中名为 aWidget 的 Widget 实例的示例“年龄”,你会有类似的东西:
NSPredicate *agePredicate = [NSPredicate predicateWithFormat:@"name='age'"]; NSSet *ageInputs = [aWidget.inputs filteredSetUsingPredicate:agePredicate];
我理解问题了吗?
【讨论】:
感谢您完成了我做不到的事情并连贯地表达了我自己的问题。您建议的解决方案正是我目前解决问题的方式。我同意这种安排很丑陋,因此想知道是否有更优雅的解决方案。我希望没有,毕竟我可能要求 CoreData 以一种非设计的方式运行,以便利用预制数据存储处理的便利性。非常感谢。【参考方案2】:如果您希望能够充分利用快速高效的店内查询的便利,真的没有比这更好的方法了。目前尚不清楚您在其他 cmets 中要问什么,我想这就是您尚未得到任何答案的原因。
请记住,Core Data 支持多对多关系,无需“连接表”。
如果 Widget 有许多 Inputs 或 Outputs(我怀疑它们可能是同一个实体),那么 Widget 和 Input 之间的多对多双向关系(在 Core Data 用语中是一种反向关系)是一切你需要的。然后您需要做的就是查看您的 Input 实例是否在 Widget 实例的 -inputs 中,或者 Widget 实例是否在 Input 实例的 -widgets 中。
这就是你要找的吗?如果不是,请尝试澄清您的问题(通过编辑它,而不是通过附加 cmets :-))。
【讨论】:
以上是关于CoreData 引用的主要内容,如果未能解决你的问题,请参考以下文章
CoreData 对成员“id”Xcode 12 的模糊引用
CoreData + mogenerator - 如何防止中间数据模型中的`setValue(forKey :)`引用最终数据模型中实体的'人类'类?