【问题标题】:Complex Core data relationship mess复杂的核心数据关系混乱
【发布时间】:2012-02-20 23:37:21
【问题描述】:

需要关于几个实体及其关系以及整个处理方法的建议。一段时间后,当您真正尝试使某些东西变得真实时,那里的许多核心数据教程和示例似乎很简单!..因此问题是:

我需要知道方法以及我所做的是否可行。假设用户创建了他的个人资料并开始整理名片。从一开始,假设该应用程序能够处理许多用户。

型号: 实体:

1-用户 2卡组 三张牌 4-条目

现在这是四个实体。 User 是添加的用户列表,每个用户都持有自己的一组卡片。这只是使用设备(应用程序)的用户,而不是正在存储的实际名片列表。例如,一个用户是我,我有一堆名片在这个应用程序中整理。这个实体“用户”不会持有印在名片上的姓名,.. 希望你明白这一点。

实体卡,持有名片列表。这是实际将数据保存到卡中的主要部分。

CardGroup,这是智能组。用户可以向其中添加类别,例如“Wallstreet”作为一个组,另一个可以是“Silicon valley”,他们可以是“UniversityMen”或只是“Laydees”。

条目有点像卡片的复制品,假设那个人随着时间的推移有 5 个不同的工作,这个条目只包含卡片的那些随着时间而改变的方面。可以说是跟踪器..

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

1- 用户>卡组 一个用户可以有多个卡片组 - Wallstreet、SiliconValley、MyCity、WorkPlace

2- CardGroup >CardDude 每个 cardGroup 可以容纳一堆 biz 卡。 CardDude 可以是 WallStreet 和/或 MyCity 的一部分,这是否相同..? 此外,华尔街可以容纳许多卡片。 我很困惑这是多对多关系还是一对多关系 CardGroup > CardDude

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

3。 用户只能知道 One CardDude 对吗?让我们叫他们杰森,显然不能有很多有点杰森。?它必须只有一个。 因为这种关系是 用户CardDude 一对一。 我什至不确定这里..

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

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

这里的借口是,当添加卡片时,这应该为用户只发生一次,并且不能让用户多次添加同一个卡片,如果不同的用户正在添加,他可以。

这是更大的难题, 现在我想将最新信息添加到 CardDude, 我称之为入口。它所做的只是创建一个时间戳,并添加一个 CardDude Jason 的条目,关于他可能拥有的一张新卡。可以说是一份新工作。

我想查看每个组.. 用 sql 术语,

选择 ENTRY.name ENTRY WHERE USER = ME AND CARDGROUP = WALLSTREET

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

在哪里,用户(我)CardDude(杰森)

 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 到 CardGroup 中的 CardEntry(包括所有 CardPerson)的理想方式。 . 现在我只是在迭代,但必须有更好的方法来获取所有这些 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)并使用时间戳作为排序顺序获取 CardEntries。

据我了解..当我添加新的 CardEntry 时,我只是在使用

[cardPerson addCardEntryObject:newEntry];

是否理解这个“newEntry”是 CardPerson-->then CardGroup-->Current -User 的一部分?假设在应用启动时选择了一个用户并且 cardGroups 是从那里派生的?核心数据能解决这个问题吗?当应用程序切换用户并选择相同的 CardPerson 时,我不希望这个 newEntry 出现! 非常感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

    首先。

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

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


    您的核心数据模型实际上并不是很复杂。你可能想多了。

    如果我创建一个核心数据模型,它可以帮助我从现实世界的角度进行思考。

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

    你最终会得到这样的结果:


    那么如何避免 CardPersons 的重复条目呢?

    手动。
    通常您没有足够的业务联系人信息来区分同名人员。
    也许你认识两个叫杰森史密斯的人。其中一个是 iOS 开发者,另一个是农民。 您可能不想将它们存储为同一个人。
    但很可能你对这个人不太了解。你知道他们的名字和姓氏。通常就是这样。例如,如果您知道出生日期和出生地点,则可以自动区分这两个人。但由于您没有这些信息,您必须询问用户新名片是否属于名为 Jason Smith 的现有用户。

    【讨论】:

    • 你太棒了!..谢谢你抽出时间来。我觉得我在这里理解了一些东西。但有一件事,用户和 CardPerson 之间没有关系?
    • 还有.. 最后一件事,我假设在获取 CardGroups 时,我必须为该用户分配一个 NSPredicate,这没关系。假设我点击 WallStreet 这有 两个 CardPerson - John, Jane,每个都有至少 3 个条目.我想挖掘出底线条目,通常是 CardGroup.persons = [NSSet],它会遍历每个集合.. 'CardPerson.entries' 最后结合两个 NSSet 将为我提供 6 个条目。在没有 CardPerson 的情况下直接获取条目的正确 Coredata 方法是什么,.. 因为我现在不是在寻找特定的人..
    • 您不需要 User 和 CardPerson 之间的关系。 Core Data 就像一个对象图。您将使用核心数据模型中的关系。你沿着一连串的关系“走”,直到你得到你想要的对象。如果您想要所有“属于”用户对象的人,您将获取属于该用户的所有 CardGroups 并获取每个 CardGroups 的 CardPersons。
    • 第二件事我会在 CardEntry 中添加一个 BOOL "isLatestEntry" 并在添加新条目时进行相应的管理。然后 NSPredicate 可以检查 isLatestEntry 的状态以获取所有当前条目。恕我直言,这是最简单的方法。
    • 嘿,@Matthias 在最后一刻有点怀疑我有..如果你能就此提出建议,我将不胜感激,我编辑了问题并在更新后发布了相关内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2015-05-27
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多