CoreData设计模式:持久存在多个NSPessistentObjectContexts的多个或多个对象?

Rog*_*Rog 0 persistence core-data

我正在将应用程序从SQLitePersistentObjects转换为CoreData.

在应用程序中,有一个类,我从我的服务器检索的XML文件生成许多*实例.UI可以触发动作,要求我保存这些对象的一些*,直到下次调用应用程序.

除了为每个这些对象提供单个NSManagedObjectContext之外(仅与其可包含blob的子服务对象共享).我无法看到如何对持久化对象进行细粒度控制(即在对象级别)的方法.如果我尝试为所有新创建的对象创建一个上下文,当我尝试将一个对象移动到一个新的上下文时,我会得到一个异常,所以我可以将它保存在自己的上面.我猜这是因为它拥有的对象留在'旧'上下文中.

我看到的另一个选项是拥有一个上下文,保留我的所有对象,然后删除我以后不需要的那些 - 这感觉就像它会过多地击中数据库但是CoreData可能会有魔力.

所以:

  1. 我是否遗漏了关于我的CoreData应用程序应该如何构建的基本方法?
  2. 每个对象的上下文是一个好的设计模式吗?
  3. 是否有更好的方法在上下文之间移动对象以避免2?

*其中"many"表示"数十,数百,不是数千","some"至少比"many"少一个数量级

交叉发布到Apple论坛.

Bar*_*ark 5

核心数据实际上不是对象持久性框架.这一个对象图管理框架,恰好能够将该图形坚持到磁盘(请参阅之前的SO回答更多信息).因此,尝试使用Core Data来保留对象图中的一些对象将会对抗粒度.核心数据更倾向于管理您要创建的所有对象的整个图形.所以,选项并不完美,但我看到了几个(包括你提到的一些):

  1. 您可以在Core Data上下文中创建所有对象,然后删除您不想保存的对象.在您保存上下文之前,所有内容都在内存中,因此不会像您建议的那样"返回数据库".即使在保存到磁盘之后,Core Data也非常擅长缓存上下文行缓存中的实例,并且只需要很少的开销就可以让它做它的事情并且不用担心磁盘上的内容和内存中的内容.
  2. 如果您可以先创建所有对象,然后在决定保存哪些对象之前执行内存中的所有处理,则可以使用仅具有内存持久性存储的持久性存储协调器创建单个NSManagedObjectContext.当您决定要保存哪些对象时,可以将持久性(XML /二进制/ SQLite)存储添加到持久性存储协调器,将要保存的对象分配给该存储(使用上下文(void)assignObject:(id)object toPersistentStore:(NSPersistentStore *)store),然后保存上下文.
  3. 您可以创建Core Data之外的所有对象,然后将要保存的对象复制到Core Data上下文中.
  4. 您可以在单个内存中的上下文中创建所有对象,并编写自己的方法将这些对象的属性和关系复制到新上下文,以便只保存所需的实例.除非模型中的实体有很多关系,否则这并不难(请参阅页面以获取有关使用多遍方法将对象从一个存储迁移到另一个存储的提示;它描述了在管理对象模型版本控制的上下文中的技术并且在10.5中不再需要用于此目的,但该技术也适用于您的用例).

就个人而言,我会选择1 - 让Core Data做自己的事情,包括管理对象图中的删除.