iOS 核心数据轻量级迁移

Posted

技术标签:

【中文标题】iOS 核心数据轻量级迁移【英文标题】:iOS core data lightweight migration 【发布时间】:2012-12-12 17:53:20 【问题描述】:

我遇到了核心数据轻量级迁移的问题。 带有第一个模型版本的应用程序已提交到 AppStore。 然后是版本 2 的数据模型(提交)。 最后经过一些更改,我添加了模型的第 3 版并将其提交到 AppStore。

在测试设备上一切正常,因为迁移是逐步完成的 (v1 - v2 - v3)。

但它不适用于从 AppStore 更新应用程序的用户,例如它试图从版本 1 迁移到最高版本 3(跳过版本 2)。

我该如何解决这个问题? 谢谢。

【问题讨论】:

你用的是subversion或者git这样的系统控制版本吗? 【参考方案1】:

这是一个蛮力解决方案,但删除商店是解决您问题的一种选择:

// Setup CoreData with MagicalRecord && remove CoreData store
// The flag is used to perform the delete just once
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"CORE_DATA_FLAG01"]) 
    NSURL *storeURL =[NSPersistentStore MR_urlForStoreName:@"YourStore.sqlite"];
    LOG(@"%@", storeURL);
    NSFileManager *fm = [[NSFileManager alloc] init];
    NSError *error = nil;
    [fm removeItemAtURL:storeURL error:&error];
    if (error) 
        LOG(@"error %@", error);
     else 
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"CORE_DATA_FLAG01"];
    

我正在使用 MagicalRecord 与 CoreData 进行交互。在这种情况下,我使用该函数来获取商店。

【讨论】:

仅供参考,LOG 是一个在我处于调试模式时执行 NSLog 的宏。【参考方案2】:

通过轻量级迁移,如果 V1->V2 有效且 V2->V3 有效,那么直接从 V1->V3 迁移应该没有问题 - 除非您搞砸了。 :)

启动 V1 版本,然后切换到 V3 并逐步调试问题。

NSDictionary *options = @
                          NSMigratePersistentStoresAutomaticallyOption: @YES,
                          NSInferMappingModelAutomaticallyOption: @YES
                         ;
NSError *error;
NSPersistentStore *persistentStore = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
if (!persistentStore) 
    NSLog(@"migration failed: %@", error);

【讨论】:

以上是关于iOS 核心数据轻量级迁移的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的 CoreData 轻量级迁移失败

iOS8.1 Core-数据轻量级+重量级迁移

轻量级迁移核心数据

轻量级迁移后核心数据执行动作

核心数据轻量级迁移属性重命名

没有找到适合核心数据迁移的映射模型