核心数据在商店之间共享对象

时间:2012-02-20 21:10:32

标签: objective-c ios core-data

我使用Core Data创建了一个对象数据库。我希望我的应用程序具有支持多个用户的功能。每个用户都应该能够看到存储在数据库中的对象列表,然后可以在应用程序中选择他们想要在其帐户中使用的所需对象。

实施此方法的最佳方法是什么?我想为每个用户创建一个单独的持久存储。共享对象,例如用户选择的默认主对象列表,应该是“公共”持久性存储的一部分,每个用户的持久存储中的对象将指向该存储,因此我不会创建一堆重复的对象。

最重要的是,主列表中的每个对象都有子管理对象。每个用户都可以修改子项,因此它们对每个用户的持久存储都应该是唯一的。

有关最佳做法的建议吗?我是Core Data的新手。

注意:一次只能登录1个用户。

非常感谢!

2 个答案:

答案 0 :(得分:4)

为什么你需要单独的商店?我想你会发现,如果你沿着这条路走下去会很快变得非常复杂,特别是如果你是Coredata的新手。

因此,除非你有真正的理由去单独的商店,这就是我要做的事情:

  1. 创建您的UserObject个实体并关联 特性
  2. User和之间创建多对多关系 Object个实体(和反向)
  3. 让用户创建他们的个人资料(即创建一个新的User实例)
  4. 获取所有可用的Object个实例
  5. 用户选择他们感兴趣的实例后,通过关系将Object实例与User实例相关联。或者,您可以创建该对象的新实例,该实例对于您的User是唯一的(这是我的偏好,因为您提到需要具有由用户自定义的“子”对象)。
  6. 完成后,保存上下文
  7. 从此处开始,您将能够通过访问关系user.objects来获取该特定用户感兴趣的所有对象。您还可以通过反向关系User获取与特定Object相关联的所有object.users个实例。
  8. 由于

答案 1 :(得分:3)

您可以将多个商店添加到同一个持久性商店协调员,它应该都可以正常工作。有些事情要知道:

  1. 如果您有多个包含相同实体的商店(即对象类型),则必须使用NSManagedObjectContext的-assignObject:toPersistentStore:方法来告知上下文为每个新对象使用哪个商店你添加的。

  2. 任何特定对象只能存在于一个持久性存储中。例如,如果您有多个Person对象,如Tom,Dick和Harriet,则这三个对象可以存在于单个存储中,或者它们可以在多个存储中分配,但是给定的对象(如Tom)只能存在于单个存储中。

  3. 核心数据不允许您在不同商店中的对象之间创建关系。如果Tom和Dick是兄弟,并且您想在模型中记录该关系,则应将它们分配到同一个商店。可以使用fetched属性而不是关系,但这并不像关系那么简单。

  4. 因此,如果沿着单独的商店路径走下去,公共商店可能包含一组“原型”对象供用户选择。当用户选择一个对象时,您将该对象复制到用户自己的商店中,并从该点开始使用该新对象。这样,您可以使用关系来跟踪每个对象的子项,并且子项的更改对每个用户都是唯一的。另一种方法是将主要对象保留在公共存储中,并使用获取的关系将它们与用户存储中的子对象相关联,但这看起来更复杂。