我使用Core Data创建了一个对象数据库。我希望我的应用程序具有支持多个用户的功能。每个用户都应该能够看到存储在数据库中的对象列表,然后可以在应用程序中选择他们想要在其帐户中使用的所需对象。
实施此方法的最佳方法是什么?我想为每个用户创建一个单独的持久存储。共享对象,例如用户选择的默认主对象列表,应该是“公共”持久性存储的一部分,每个用户的持久存储中的对象将指向该存储,因此我不会创建一堆重复的对象。
最重要的是,主列表中的每个对象都有子管理对象。每个用户都可以修改子项,因此它们对每个用户的持久存储都应该是唯一的。
有关最佳做法的建议吗?我是Core Data的新手。
注意:一次只能登录1个用户。
非常感谢!
答案 0 :(得分:4)
为什么你需要单独的商店?我想你会发现,如果你沿着这条路走下去会很快变得非常复杂,特别是如果你是Coredata的新手。
因此,除非你有真正的理由去单独的商店,这就是我要做的事情:
User
和Object
个实体并关联
特性User
和之间创建多对多关系
Object
个实体(和反向)User
实例)Object
个实例Object
实例与User
实例相关联。或者,您可以创建该对象的新实例,该实例对于您的User
是唯一的(这是我的偏好,因为您提到需要具有由用户自定义的“子”对象)。user.objects
来获取该特定用户感兴趣的所有对象。您还可以通过反向关系User
获取与特定Object
相关联的所有object.users
个实例。由于
答案 1 :(得分:3)
您可以将多个商店添加到同一个持久性商店协调员,它应该都可以正常工作。有些事情要知道:
如果您有多个包含相同实体的商店(即对象类型),则必须使用NSManagedObjectContext的-assignObject:toPersistentStore:
方法来告知上下文为每个新对象使用哪个商店你添加的。
任何特定对象只能存在于一个持久性存储中。例如,如果您有多个Person对象,如Tom,Dick和Harriet,则这三个对象可以存在于单个存储中,或者它们可以在多个存储中分配,但是给定的对象(如Tom)只能存在于单个存储中。
核心数据不允许您在不同商店中的对象之间创建关系。如果Tom和Dick是兄弟,并且您想在模型中记录该关系,则应将它们分配到同一个商店。可以使用fetched属性而不是关系,但这并不像关系那么简单。
因此,如果沿着单独的商店路径走下去,公共商店可能包含一组“原型”对象供用户选择。当用户选择一个对象时,您将该对象复制到用户自己的商店中,并从该点开始使用该新对象。这样,您可以使用关系来跟踪每个对象的子项,并且子项的更改对每个用户都是唯一的。另一种方法是将主要对象保留在公共存储中,并使用获取的关系将它们与用户存储中的子对象相关联,但这看起来更复杂。