复杂的核心数据关系混乱

时间:2012-01-28 02:37:11

标签: iphone objective-c xcode cocoa-touch core-data

需要就几个实体及其关系及其整体方法提供建议。很多核心数据教程和示例在一段时间后看起来很简单,当你真正尝试创造真实的东西时!...因此问题:

我需要知道这种方法,如果我做了什么就可以了......让我们说用户创建他的个人资料并开始组织名片。从一开始,让我们说该应用程序能够处理许多用户。

模型: 实体:

1-用户 2- CardGroup 3卡 4-条目

现在这些是四个实体。 用户是添加的用户列表,每个用户都持有自己的一组卡。这是简单的用户使用设备(APP)而不是人们的名单实际商业卡正在存储。例如,一个用户就是我,我有一堆名片在这个应用程序中组织。这个实体'用户'不会拿着名片上的名字,希望你明白这一点。

实体卡,持有名片列表。这是实际将数据保存到卡上的主要内容。

卡德集团,这是智能团体。用户可以添加类别,例如" Wallstreet"作为一个群体,另一个群体可能是"硅谷",他们可能是" UniversityMen"或只是" Laydees"。

条目这有点像卡片的副本,假设那个人随着时间的推移有5个不同的工作,这个条目只是保持随着时间的推移而变化的卡片的那些方面。跟踪器可以这么说..

我想弄清楚这里的关系..

1- User< ----------------->> CardGroup 用户可以拥有多个卡片组 - Wallstreet,SiliconValley,MyCity,WorkPlace

2- CardGroup< ------------>> CardDude 每个cardGroup都可以容纳一堆商务卡。 CardDude可以成为WallStreet和/或MyCity的一部分,它说的是相同的......? 此外,Wallstreet可以持有许多卡。 我很困惑这是多对多关系还是一对多关系 CardGroup<< ------------->> CardDude

这让我意识到英语不是我的第一语言。

3。 用户只能知道One CardDude吗?让我们打电话给杰森,很明显不可能有很多善意的原因。它必须只有一个。 而且这种关系就是这样的 用户< ----------------> CardDude一对一。 我甚至不确定..

此外,如果我的父亲是这个应用程序的另一个用户(他的名字在第一个实体" User"),那么他可能有他的CardDude Jason副本。是的,我愿意这样做是有原因的。嗯...所以最后,我和我爸爸都在CardDude中有他们的Jasons。如果我将Jason修改为用户,那么它应该反映在其他CardGroups上,例如wallstreet,silicon,而不是我父亲的用户entires,这应该保持不变(假设他之前创建了一个类似的)。

再次,我不确定现在的关系是什么 用户< ------------------> CardDude

这里的借口是,当添加一个carddude时,这应该只对USER发生一次,而不是让USER多次添加相同的CARDUDE,如果另外一个USER正在添加,他可以。

这是一个更大的难题, 现在我将最新信息添加到CardDude, 我打电话给它。所有这一切都是创建一个timeStamp,并添加一张CardDude Jason的条目,关于他可能拥有的新卡片。可以这么说,新工作。

我想看看每个群组......用sql术语来说,

选择ENTRY.name ENTRY,其中USER = ME和CARDGROUP = WALLSTREET

      I thot I'd have 
  CardGroup(WallStreet) <----------->>CardDude (Jason) and some more<----------->>Entry

在哪里,用户(我)&lt; ------------&gt; CardDude(Jason)

 USER<-------------->>CardGroup to many
  USER<--------------->CardDude (onetoone)
  USER<--------------->>Entry (to many)

  CardGroup<------------>>CardDude
  CardDude<------------->>Entry (tomany) can tell me how many last cards did Jason get..

请指导我如何在这里获得清晰的图片,因为每个用户只能与CardDude有一个关系,我将如何避免输入重复的类似条目.. 另一点是,我父亲的用户将重新创建整个卡组,卡片和条目。他们非常独立。

谢谢,这是一个冗长的问题......

更新:在回答之后,我理解了很多东西,现在还有一件事,它们是从CardGroup到CardEntry(包括所有CardPerson&#39; s)的理想方式。那个CardGroup ......现在我只是在迭代,但是这是获得所有CardEntries的更好方法。

 //cardGroupFriends  is a CardGroup object        
  for(CardPerson *person in [cardGroupFriends persons]){
             for(CardEntry *entry  in [person entries]){
                 NSLog(@"%@ = %@", person.name, entry.company);
             }
         }

我无法帮助,但通过sqlite路线来解决这个问题......但我还是喜欢核心数据!它实际上使事情变得非常简单。 我在考虑NSFetchedResultsController从CardGroups获取CardEntries,绕过CardPerson实体(假设我在CardGroups中获取所有CardPersons)并使用timeStamp作为排序顺序获取CardEntries。

根据我的理解......当我添加一个新的CardEntry时,我只是在使用

[cardPerson addCardEntryObject:newEntry];

是否理解这个&#34; newEntry&#34;是CardPerson的一部分 - &gt;然后是CardGroup - &gt; Current -User ??假设在应用程序启动时选择了用户,并且从那里派生了cardGroups?核心数据是否会解决这个问题?当应用切换用户并选择相同的CardPerson时,我不希望这个newEntry显示出来! 非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

首先。

  

我想看看每个小组.. 用sql术语

停止这样做。核心数据不是sql。


您的核心数据模型实际上并不复杂。你可能过度思考了。

如果我创建核心数据模型,它可以帮助我在现实世界中进行思考。

所以你有一个用户(使用他自己的实体卡盒)。这个盒子有组(复数!= to-many)。但每个组只在一个卡盒中(与单个用户相反) 这些小组中的每一个都有很多人(复数)。接下来的事情在真实世界的卡片盒中是不可能的,但是每个人可以在许多组中(反向关系,多对多)。
最后,您希望存储多个(多对)名片。但每张名片只能属于一个人(反向关系,单一)

你最终会得到类似的东西:

enter image description here


那么如何避免CardPersons的重复输入?

手动。
通常,您没有足够的业务联系信息来区分具有相同名称的人员 也许你认识两个名叫Jason Smith的人。在他们身上是一个iOS开发人员,另一个是农民。 您可能不希望将它们存储为同一个人 但很可能你对这个人了解不多。你知道他们的名字和姓氏。通常就是这样。如果您知道例如出生日期和出生地,您可以自动区分这两个人。但由于您没有这些信息,因此您必须询问用户新名片是否属于名为Jason Smith的现有用户。