Iphone 执行核心数据迁移时内存不足

Iphone 执行核心数据迁移时内存不足,iphone,multithreading,core-data,iphone-sdk-3.0,core-data-migration,Iphone,Multithreading,Core Data,Iphone Sdk 3.0,Core Data Migration,我正在应用程序的两个版本之间迁移CoreData模型。在以前的版本中,我将二进制数据存储为blob,为了提高性能,我希望将它们从blob中删除。我的问题是,在迁移过程中,核心数据似乎会将所有内容加载到内存中,从而导致内存不足警告,然后导致我的应用程序被终止 苹果的文档建议如下: 然而,它似乎依赖于这样一个事实,即大型对象应用了不同的映射。 在我的例子中,所有对象基本上都是相同的,必须对每个对象应用相同的映射。在这种情况下,我不知道如何应用他们的技术 我应该如何处理具有非常大对象的迁移?我猜除了

我正在应用程序的两个版本之间迁移CoreData模型。在以前的版本中,我将二进制数据存储为blob,为了提高性能,我希望将它们从blob中删除。我的问题是,在迁移过程中,核心数据似乎会将所有内容加载到内存中,从而导致内存不足警告,然后导致我的应用程序被终止

苹果的文档建议如下:

然而,它似乎依赖于这样一个事实,即大型对象应用了不同的映射。 在我的例子中,所有对象基本上都是相同的,必须对每个对象应用相同的映射。在这种情况下,我不知道如何应用他们的技术


我应该如何处理具有非常大对象的迁移?

我猜除了从blob中提取数据之外,您还需要做一些更改。我的建议是分几个阶段进行迁移。我在这里想得很清楚,所以这方面可能会有所改进。这要求您使用SQLite

为了实现这一点,您将有三个版本的模型:

  • 原始模型
  • 删除了属性的模型(可能添加了一个特殊的唯一ID——见下文)
  • 包含您所做的所有更改的模型,包括添加新实体和替换属性的关系
  • 这样做的原因是,通过自动轻量级迁移,从版本1到版本2的转换应该是可行的。在这种情况下,核心数据不需要加载任何内容到内存中——它只需要发出SQL语句,直接在数据库上进行更改

    因此,首先使用旧型号版本设置持久存储协调器。加载数据后,检查要迁移的所有对象,提取二进制属性,然后以某种方式将其写入磁盘。您可以使用带有批处理和常规自动释放池排水的获取请求,以确保不会为临时对象使用太多内存。将数据存储到使用NSCachesDirectory获得的目录中。显然,您希望以一种能够将数据与对象的managedObjectID关联起来的方式来存储数据

    然后,关闭一切,并要求Core Data将存储从版本1迁移到版本2。有关详细信息,请参阅。用版本2打开商店

    您可能需要添加一个步骤,为每个对象分配某种唯一的ID,因为我不确定核心数据在进行非轻量级迁移时是否维护对象ID。如果您需要这样做,您的版本2模型将向要从中提取二进制数据的对象添加一个新属性,该属性可以是可选的,也可以是默认值集。由于轻量级迁移不应更改ManagedObjects,您可以至少保存新的唯一ID到ManagedObjects的映射,该映射与两段前保存的二进制数据一起保存

    保存数据并关闭存储

    打开应用商店,从版本2迁移到版本3,基本上应该是发布问题之前已经编写的代码。打开存储后,添加从版本1存储保存的所有对象,并使用沿途保存的数据设置关系


    简单,对吗?

    谢谢Jacques,实际上这给了我一个很好的提示,我做了一些类似的事情,但没有像SQLite那么低。但我自己创建了两个不同的商店,并在每个商店中创建对象。棘手的部分是确保核心数据一经使用就将对象转化为故障。