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



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

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

这是我的问题:

每个CMAUserDefine对象都有一组有序的对象。例如,“诱饵” CMAUserDefine将具有一组有序的CMABait对象,“物种” CMAUserDefine将具有一组有序的CMASpecies对象,等等。

每个CMAEntry对象都具有指向相应CMAUserDefine对象中的对象的属性,例如baitUsed,fishSpecies等。因此,如果进行了更改,则引用该对象的每个CMAEntry也会更改。

现在,从我阅读的内容中,我应该对我的每个关系都求反。在我的模型中,这没有意义。例如,我可能有5个CMAEntry对象,其baitUsed属性指向同一CMABait对象。如果有5个CMAEntry对象引用该CMABait,则CMABait的entry属性指向哪个CMAEntry?我认为它不应指向任何内容。

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

我最初使用NSArchiving可以很好地工作,但是存档文件的大小为MASSIVE。我的意思是,对于16个左右的条目(包括约20张图像),需要18 MB以上的内存。从我所读的内容中,无论如何我还是应该学习核心数据。

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

我希望这是有道理的。如果需要进一步说明,请告诉我。

谢谢!

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

最佳答案

A.一些基础

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

在由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.对你的问

在您的情况下,如果CMAEntry对象恰好引用了一个CMASpecies对象,但是CMASpecies对象可以被许多CMAEntry对象引用,则仅表示逆关系是一对多关系。

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

举一个更简单的例子:对体育联赛建模时,您会发现自己拥有一个实体Match,其属性为homeTeamguestTeam。您想有一个逆向关系,不是不是homeMatchesguestMatches,而是matches。这显然不是反函数。如果核心数据想要并且不关心它,只需添加反关系。

09-07 14:19