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

时间:2009-06-08 14:21:21

标签: core-data persistence

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

在应用程序中,有一个类,我从我的服务器检索的XML文件生成许多*实例。用户界面可以触发需要我保存这些对象的部分 *的操作,直到下次调用该应用程序为止。

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

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

所以:

  1. 我是否遗漏了一些关于构建CoreData应用程序的基本知识?
  2. 每个对象的上下文是一个好的设计模式吗?
  3. 有没有更好的方法在上下文之间移动对象以避免2?
  4. *其中“many”表示“数十,数百,不是数千”,“某些”至少比“很多”小一个数量级

    cross posted to the Apple forums

1 个答案:

答案 0 :(得分:5)

核心数据实际上不是对象持久性框架。 一个对象图管理框架,恰好可以将该图表保存到磁盘(有关详细信息,请参阅this以前的SO答案)。因此,尝试使用核心数据来保持对象图中对象的某些将会起作用。核心数据更倾向于管理您要创建的所有对象的整个图形。所以,选项并不完美,但我看到了几个(包括你提到的一些):

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