ios - 核心数据模型——实体和逆

标签 ios objective-c iphone xcode core-data

我是 Core Data 的新手,我正在尝试将其实现到我现有的项目中。这是我的模型:

enter image description here

现在,有些事情对我来说没有意义,可能是因为我没有正确建模。

CMAJournal 是我的顶级对象,具有一组有序的 CMAEntry 对象和一组有序的 CMAUserDefine 对象。

这是我的问题:

每个 CMAUserDefine 对象都有一组有序的对象。例如,“Baits”CMAUserDefine 将具有一组有序的 CMABait 对象,“Species”CMAUserDefine 将具有一组有序的 CMASpecies 对象等。

每个 CMAEntry 对象都具有 baitUsed、fishSpecies 等属性,这些属性指向相应 CMAUserDefine 对象中的一个对象。如果进行了更改,那么引用该对象的每个 CMAEntry 也会更改。

现在,从我读到的内容来看,我应该对我的每段关系都有逆向。这在我的模型中没有意义。例如,我可以有 5 个 CMAEntry 对象,它们的 baitUsed 属性指向同一个 CMABait 对象。如果有 5 个 CMAEntry 对象引用该 CMABait,则 CMABait 的入口属性指向哪个 CMAEntry?我不认为它应该指向任何东西。

我想要的是将所有 CMAUserDefine 对象(即所有 CMABait、CMASpecies、CMALocation 等对象)存储在 CMAJournal userDefines 集中,并在每个 CMAEntry 中引用这些对象。

我最初使用 NSArchiving 时效果很好,但归档文件的大小非常大。我的意思是,16 个左右的条目(包括大约 20 张图像)需要 18+ MB。根据我的阅读,Core Data 是我无论如何都应该学习的东西。

所以我想知道,是不是我的模型错了?我采取了错误的方法吗?是否有更有效的使用 NSArchiver 的方式来更好地满足我的需求?

我希望这是有道理的。如果我需要更好地解释,请告诉我。

谢谢!

E:导致我提出这个问题的是一堆“对无效对象的悬挂引用”。 = ""尝试保存时出错。

最佳答案

一个。一些基础知识

核心数据需要逆关系来建模关系。长话短说:

在由 Core Data 建模的对象图中,引用在语义上从源对象指向目标对象。因此,您使用单个引用作为 CMASpeciesfishSpecies 来建模一对一关系,并使用集合作为 NSSet 来建模一对多关系。您不关心逆关系的类型。在许多情况下,您根本没有。

在关系数据库中,关系的建模方式不同:如果您有 1:N(一对多)关系,则该关系存储在目标端。原因是,在 rDB 中,每个实体都有固定的大小,因此不能引用可变数量的目的地。如果您有多对多关系 (N:M),则需要额外的表。

如您所见,在对象图中,关系类型是一对一和一对多,仅取决于源,而在 rDB 中,关系类型是一对一,一对多,多对多取决于源和目的地。

要选择正确的 rDB 建模类型,Core Data 需要知道逆关系的类型。

Type Object graph Inverse    | rDB
1:1  to-one id    to-one id  | source or destination attribute
1:N  collection   to-one id  | destination attribute
N:M  collection   collection | additional table with two attributes

B.给你的Q

在您的情况下,如果 CMAEntry 对象仅引用一个 CMASpecies 对象,但 CMASpecies 对象可以被多个 引用CMAEntry 对象,这仅仅意味着逆关系是一对多关系。

是的,对于 OOP 开发人员来说,拥有这样的逆关系很奇怪。对于 SQL 开发人员来说,这是常见的情况。开发 ORM(对象关系映射器)这是问题之一。 (我知道这一点,因为我现在正在为 Objective-Cloud 做这件事。但如果不同的话,我所做的更多是 OOP 的观点。)每个解决方案对于一方来说都是一种不寻常的。有人将 ORM 称为“软件开发的越南”。

举一个更简单的例子:对体育联盟进行建模,您会发现自己有一个具有属性 homeTeamguestTeam 的实体 Match。您想要建立反向关系,不是 homeMatchesguestMatches,而是简单的 matches。这显然不是倒数。如果 Core Data 想要并且不关心它,只需添加逆关系即可。

关于ios - 核心数据模型——实体和逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28161987/

相关文章:

iphone - 用手势画线

iphone - 重用 NSURLConnection 实例

iphone - gcc-4.2 失败,退出代码 1 iphone

ios - 仅使 UITableView 的某些部分可编辑

ios - AVFoundation - 视频合并但仅播放最后一个视频

iphone - 在以编程方式填充的 TableView 中不刷新屏幕

iphone - 我想将 UIButton 移动到特定位置,例如在网格上

objective-c - iOS AVFoundation 将视频流式传输到 OpenGL 纹理

ios - 警告 : will never be excuted

iphone - 发送到实例的选择器无效 - objectForKey :