代码之家  ›  专栏  ›  技术社区  ›  Rog

coredata设计模式:持久化一个包含多个或多个nsPresistentObjectContext的对象?

  •  0
  • Rog  · 技术社区  · 15 年前

    我正在将一个应用程序从sqlitepsistentObjects转换为coredata。

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

    除了这些对象都有一个单独的nsmanagedObjectContext(仅与可以包含blob的从属对象共享)。我看不出如何对哪些对象进行细粒度控制(即在对象级别)。如果我尝试为所有新创建的对象创建一个单独的上下文,那么当我尝试将一个对象移动到一个新的上下文中时,我会得到一个异常,这样我就可以自己将它持久化。我猜这是因为它拥有的对象被留在“旧”的上下文中。

    我看到的另一个选择是有一个单一的上下文,持久化我的所有对象,然后删除那些我以后不需要的对象——这感觉它会对数据库造成太大的影响,但也许coredata会有魔力。

    所以:

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

    *其中“many”的意思是“数十,也许数百,而不是数千”,“some”至少比“many”小一个数量级。

    阿尔索 cross posted to the Apple forums .

    1 回复  |  直到 15 年前
        1
  •  5
  •   Community Egal    7 年前

    核心数据实际上不是对象持久性框架。它 一个对象图形管理框架,恰好能够将该图形持久化到磁盘上(请参见 this 上一页,请回答以获取更多信息)。所以尝试使用核心数据来保持 一些 对象图中的对象将对纹理进行处理。核心数据更愿意管理您要创建的所有对象的整个图形。所以,这些选择并不完美,但我看到了几个(包括你提到的一些):

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

    就个人而言,我将使用选项1——让核心数据完成它的工作,包括管理从对象图中删除的内容。