核心数据模型 - 实体和反转

时间:2015-01-27 01:56:18

标签: 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工作得很好,但存档文件大小很大。我的意思是,18个左右的大约18个MB(包括大约20个图像)。从我读过的内容来看,Core Data是我应该学习的东西。

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

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

谢谢!

E:引导我这个问题的原因是得到了一堆“悬挂对无效对象的引用”。尝试保存时出现错误。

1 个答案:

答案 0 :(得分:1)

一个。一些基础知识

核心数据需要一种反比关系来建模关系。长话短说:

在由Core Data建模的对象图中,引用在语义上指向源对象到目标对象。因此,您使用单个引用作为CMASpecies fishSpecies来建模一对一关系,将一个集合用作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为软件开发的越南"。

举一个更简单的例子:对体育联盟进行建模后,您会发现自己拥有一个名为MatchhomeTeam的实体guestTeam。您希望有一个反比关系,不是homeMatchesguestMatches,而只是matches。这显然没有反过来。如果Core Data想要并且不关心它,只需添加反向关系。