当核心数据存储在iCloud中共享时,我试图避免使用轻量级迁移升级核心数据存储,因此我希望将存储迁移到仅本地存储,然后使用自动轻量级迁移执行升级。当商店在iCloud中时,这样做并不总是在OSX上工作,在iOS上似乎有点脆弱,需要很长时间,许多商店在应用程序下被换出,等等。
以下是我试图解决的问题:-在发布时检测应用程序何时需要将其核心数据存储升级到新的型号版本-如果需要升级并且存储在iCloud中共享,则将存储迁移到本地存储,而不自动执行核心数据轻量级迁移(升级)-然后在存储在本地时打开存储并执行升级
因此,我目前有效的解决方案是执行以下操作:-在应用程序包中创建两个核心数据模型包,两者相同,但一个设置为使用模型的最新版本,另一个设置为使用较早版本。例如,调用了'App_model‘和'App_model_old’。-使用API isConfiguration:compatibleWithStoreMetadata: NSManagedObjectModel使用'App_model‘检查兼容性,使用旧版本的模型的商店应该返回NO。-现在使用migratePersistentStore应用程序接口将存储区迁移到本地存储区,并在将存储区添加到storeCoordinator时使用旧版本的模型'App_model_old‘,以确保不会发生轻量级迁移。-然后使用新的模型包'App_model‘打开存储,以便核心数据执行轻量级迁移-最后将存储迁移回ICloud。
使用两个核心数据包似乎可以很好地工作,但必须不断克隆模型包只是一个额外的麻烦(请注意,不是很多)。然而,我想知道是否有人知道是否有可能以编程方式指定在核心数据模型包中使用哪个模型版本,以避免创建两个包,或者防止发生轻量级迁移,但仍然允许使用migratePersistentStore应用程序接口来移动存储。
发布于 2014-03-02 04:54:20
哦-我想我刚刚在https://developer.apple.com/library/mac/documentation/cocoa/conceptual/CoreDataVersioning/Articles/vmCustomizing.html#//apple_ref/doc/uid/TP40004399-CH8-SW1的苹果文档中找到了答案
NSDictionary *sourceMetadata =
[NSPersistentStoreCoordinator metadataForPersistentStoreOfType:sourceStoreType
URL:sourceStoreURL
error:&error];
NSManagedObjectModel *sourceModel =
[NSManagedObjectModel mergedModelFromBundles:nil
forStoreMetadata:sourceMetadata];
发布于 2014-03-02 13:42:49
为什么不直接对NSMigratePersistentStoresAutomaticallyOption说no呢?这不会禁用轻量级迁移吗?
NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption: @NO };
https://stackoverflow.com/questions/22120184
复制相似问题