我试图避免在iCloud中共享时使用轻量级迁移升级Core Data存储,因此我想将存储迁移到仅本地存储,然后使用自动轻量级迁移执行升级。商店在iCloud中这样做并不总是在OSX上运行,并且在iOS上看起来很脆弱,需要很长时间,很多商店会从App下面换掉等等。
以下是我要解决的问题: - 启动时检测应用程序何时需要将其Core Data存储升级到新的模型版本 - 如果需要升级并且商店在iCloud中共享,则将商店迁移到本地商店,而无需Core Data自动执行轻量级迁移(升级) - 然后打开商店并在商店为本地时执行升级
所以我的解决方案目前有效,目前正在执行以下操作: - 在App捆绑包中创建两个Core Data模型捆绑包,两者相同,但一个设置为使用最新版本的模型,另一个设置为早期版本。例如,调用'App_model'和'App_model_old'。 - 使用[NSManagedObjectModel isConfiguration:compatibleWithStoreMetadata:] API使用“App_model”检查兼容性,使用旧版本模型的商店应返回NO。 - 现在使用migratePersistentStore API将商店迁移到本地商店,并在将商店添加到storeCoordinator时使用旧版本的模型“App_model_old”,以确保不会发生轻量级迁移。 - 然后使用新的模型包'App_model'打开商店,以便Core Data执行轻量级迁移 - 然后最终将商店迁回ICloud。
使用两个Core Data捆绑包似乎工作得很好但是只需要一个额外的麻烦就是不得不继续克隆模型包(不太关心你)。不过我想知道是否有人知道是否有可能以编程方式指定在Core Data模型包中使用哪个模型版本,以避免必须创建两个bundle或交替以防止轻量级迁移发生但仍允许使用migratePersistentStore API移动商店。
答案 0 :(得分:0)
哎呀 - 我想我刚刚在Apple文档中找到答案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];
答案 1 :(得分:0)
为什么不直接为NSMigratePersistentStoresAutomaticallyOption传递?这不会禁用轻量级迁移吗?
NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption: @NO };