2012-02-20 108 views
2

我已经使用核心数据创建了对象的数据库。我希望我的应用具有支持多个用户的功能。每个用户应该能够看到存储在数据库中的对象列表,然后可以在应用程序中的帐户中选择想要使用的对象。商店之间的核心数据共享对象

实现此目的的最佳方式是什么?我想为每个用户创建一个单独的持久性存储。共享对象,就像用户选择的默认主对象列表一样,应该是“通用”持久性存储的一部分,每个用户的持久性存储中的对象都将指向这个对象,这样我就不会创建一堆重复的对象。

最重要的是,主列表中的每个对象都有子对象管理对象。这些孩子可以由每个用户修改,因此他们应该对每个用户的持久性商店都是唯一的。

有关最佳实践的任何建议?我对Core Data相当陌生。

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

非常感谢!

+1

它是mac还是iOS?请给它加标签。 – vikingosegundo 2012-02-20 21:14:29

回答

3

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

  1. 如果你有一个以上的商店包含相同的实体(即对象的类型),你将不得不使用的NSManagedObjectContext的-assignObject:toPersistentStore:方法来判断哪些存储使用上下文您添加的每个新对象。

  2. 任何特定的对象只能存在于一个永久存储中。例如,如果您有多个像Tom,Dick和Harriet这样的Person对象,三者都可以存在于一个商店中,或者它们可以在多个商店中分割,但是像Tom这样的给定对象只能存在于一个商店中。

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

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

+0

正如我了解你的答案,你告诉他,多个商店可以共享实体类,但多个商店不能共享这些实体类的*实例*,不能共享托管对象本身,这真的是他想要的。我想如果他为每个用户使用单独的商店,他将被迫创建“一堆重复的对象”,以便为每个用户提供他们对“默认主对象列表”的选择。他用Rog的用户实体方案可能会更好。 – Wienke 2012-02-20 23:46:36

+0

@Wienke感谢您的评论 - 我错过了想要分享个别对象的观点。修改答案以更好地处理这个问题。该OP似乎意图在多家商店,我可以看到一些好处。例如,如果个人用户帐户的数据按商店分隔,则可能更容易保持个人用户帐户与设备同步。另外,可能有很多用户和要求任何用户都应该能够使用任何设备,并且将单独的用户数据分开似乎对此有帮助。但是你说得很好,我希望我已经解决了它们。干杯。 – Caleb 2012-02-21 02:16:02

4

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

所以,除非你有一个真正的理由去有独立的专卖店,这里就是我想要做的:

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

因为