我是核心数据的新手,我正在尝试将它实现到我现有的项目中。这是我的模型:

现在,有些事情对我来说没有意义,很可能是因为我没有正确地建模。
CMAJournal是我的顶层对象,具有一组有序的CMAEntry对象和一组有序的CMAUserDefine对象。
,这是我的问题:
每个CMAUserDefine对象都有一组有序的对象。例如,"Baits“CMAUserDefine将有一组有序的CMABait对象,”物种“CMAUserDefine将有一组有序的CMASpecies对象,等等。
每个CMAEntry对象都具有baitUsed、fishSpecies等属性,这些属性指向相应的CMAUserDefine对象中的一个对象。如果进行了更改,引用该对象的每个CMAEntry也会发生更改。
现在,根据我所读到的,我应该对我的每一段关系都有相反的解释。这在我的模型里是没有意义的。例如,我可以有5个CMAEntry对象,其baitUsed属性指向同一个CMABait对象。如果有5个CMAEntry对象引用该CMABait,CMABait的entry属性指向哪个CMABait?我觉得它不应该指向任何东西。
我希望将所有CMAUserDefine对象(即所有CMABait、CMASpecies、CMALocation等对象)存储在CMAJournal userDefines集合中,并在每个CMAEntry中引用这些对象。
最初,我在NSArchiving中做得很好,但是存档文件的大小很大。我的意思是,18+ MB用于16条左右的条目(其中包括大约20张图片)。据我所知,核心数据是我无论如何都应该学习的东西。
,所以我想知道,我的模型错了吗?我走错路了吗?是否有更有效的方法来使用NSArchiver来更好地满足我的需要?
我希望这是有意义的。如果需要更好的解释,请告诉我。
谢谢!
E:导致我提出这个问题的是在尝试保存时得到一堆“对无效对象的悬空引用”= "“错误。
发布于 2015-01-27 04:24:37
A.一些基本知识
核心数据需要一个反向关系来模拟这种关系。长话短说:
在由Core Data建模的对象图中,从源对象到目标对象的语义引用点。因此,您可以使用单个引用作为CMASpecies的fishSpecies来建模一对一的关系,使用集合作为NSSet来模拟一对多的关系。您不关心逆关系的类型。在许多情况下,您根本没有这种关系。
在关系数据库中,关系的建模方式不同:如果您有1:N (一对多)关系,则关系存储在目标端。原因是,在rDB中,每个实体都有固定的大小,因此不能引用可变数量的目的地。如果您有一个多到多的关系(N:M),则需要一个额外的表。
正如你所看到的,在一个对象图中,关系的类型是一对一的,很多的关系只取决于源,而在rDB中,关系的类型是一对一的、一对多的、多到多的,取决于源和目的地。
要选择正确的rDB建模类型,核心数据需要知道逆关系的类型。
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 attributesB.问你的问题
在您的示例中,如果CMAEntry对象引用的正是一个CMASpecies对象,但是CMASpecies对象可以由许多CMAEntry对象引用,这就意味着逆关系是一个到多的关系。
是的,对于OOP开发人员来说,拥有这样的反向关系是很奇怪的。对于SQL开发人员来说,这是通常的情况。开发一个ORM (对象关系映射器)这是问题之一。(我知道,因为我现在是为了目标云而这么做的。但我做了,如果不一样,更多的是OOP的观点。)每一种解决方案都是一种不寻常的一面。有人称ORM为“软件开发的越南”。
要有一个更简单的例子:建模一个体育联盟,您将发现自己拥有一个带有属性Match和属性homeTeam和guestTeam的实体guestTeam。您希望有一个逆关系,不是homeMatches和guestMatches,而是简单的matches。这显然不是逆的。只要添加逆关系,如果核心数据想要而不关心它。
https://stackoverflow.com/questions/28161987
复制相似问题