内存问题在iPhone上迁移大型CoreData数据存储区

时间:2011-02-02 14:25:57

标签: iphone core-data memory-management migration

我的应用程序下面有一个可能非常大的CoreData数据存储区(可能很容易超过30MB)。我在使用自动迁移(addPersistentStoreWithType:configuration:URL:options:error:)时开始注意到内存问题,所以我开始研究迁移存储的较小部分的方法,以避免在一次迁移所有内容时发生的所有CoreData对象构建。 / p>

这在“多个通行证”部分的official documentation中进行了讨论,但看起来他们建议的方法是按实体类型划分迁移,即制作多个映射模型,每个模型都迁移一个子集完整数据模型中的实体类型。

唯一的问题是 - 如果一个实体类型是您数据存储的大部分,该怎么办?按照Apple推荐的方法,整个实体类型仍将在一次迁移中完成,内存问题可能会持续存在。

是否有任何技术可用于实际迁移特定类型的实体子集,以确保在尝试迁移所有实体时不会耗尽内存?

提前感谢您的帮助。

编辑:在进行了更多挖掘后,我发现Apple建议将DB拆分为实体类型实际上只适用于非相关实体(如discussed here),因此它更不可能解决当我最初写这篇文章时,真实世界数据库的问题比我想象的要多。

我开始认为通过NSMigrationManager实际完成的CoreData迁移现在根本无法扩展,如果您希望能够迁移,基本上不能拥有大于20-30MB的数据库它在当前的iOS设备上。唯一可行的方法似乎是完全缩短所有NSMigrationManager / NSMappingModel的内容,并在代码中完全自定义迁移。如果实际情况确实如此,那似乎是对Apple的巨大疏忽。

1 个答案:

答案 0 :(得分:2)

我可以通过利用“轻量级”迁移在短期内解决这个问题,如http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-DontLinkElementID_1中所述。

诀窍是在手动调用迁移时拉出专门用于SQLite存储类型的NSMigrationManager子类,如该页面上的最后一个代码示例所示。

这不是一个通用修复程序,因为它只有在数据存储区中的架构更改足够简单以便可以进行轻量级迁移时才有效。当你处理一个非平凡的映射时,还在等待苹果公司回复推荐的解决方案。