核心数据 - 无法实现简单的LightWeight迁移

时间:2016-12-12 15:04:20

标签: ios core-data database-migration

我无法通过简单地向数据模型中添加1个实体来实现简单的轻量级迁移。

我已阅读并遵循所有指南/文档/帖子/答案,我似乎无法找到我的错误/错误。

  • 我确实已经从现有的数据模型中创建了一个新的数据模型。
  • 我确实已将新数据模型设置为当前数据模型。
  • 我确实只为新的数据模型添加了1个实体(+指向父实体的链接)。
  • 我确实已通过方法NSMigratePersistentStoresAutomaticallyOption中的字典选项NSInferMappingModelAutomaticallyOptionaddPersistentStoreWithType

我甚至尝试记录所有内容,感谢此帖子提供的方法:core data migration

/*! The method checks the Core Data file version is compatible with the App's model version
 and then pushes the main menu view onto the navigation stack.  If not compatible it displays a
 message to the user.

 @param file The file URL for the Core Data Store. With UIManagedDocument you have to get the
 actual store file URL, you can't just use the UIManagedDocument file URL.
 */
-(void) checkCoreDataFileVersion:(NSURL*)file
{
    if ([self checkVersion:file]) {

    // file version is compatible so continue (add code to push the menu view)

    } else {

        // file version is NOT compatible

        _fileOpenErrorAlert = [[UIAlertView alloc] initWithTitle:@"Unable to open Document" message:@"Please check that you have the correct application version installed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [_fileOpenErrorAlert show];

    }
    return;
}


/*! Checks the Core Data files models version against the apps model version to see if they
 are compatible.  This will return YES if a lightweight migration can be performed and NO if NOT.

 @param fileURL The file URL for the Core Data Store. With UIManagedDocument you have to get the
 actual store file URL, you can't just use the UIManagedDocument file URL.
 @return  Returns YES if they are compatible and NO if not.
 */
- (bool)checkVersion:(NSURL*)fileURL {

    NSManagedObjectModel *model = [self managedObjectModel];

    NSLog(@" app model entity version hashes are %@", [model entityVersionHashesByName]);

    NSError *error;
    NSDictionary *metaData = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType URL:fileURL error:&error];

    if (!metaData) {
        NSLog(@"problem getting metaData");
        NSLog(@"  - error is %@, %@", error, error.userInfo);
        return NO;
    }

    bool result = [model isConfiguration:nil compatibleWithStoreMetadata:metaData];
    if (!result) {
        NSLog(@" file is not compatible!");
        NSLog(@" metadata is %@", metaData);
    }

    return result;

}

当我对所有实体的元数据做差异时,我只匹配1个实体(新创建的)的差异。那为什么它不能进行迁移呢?我刚添加了1个实体。

编辑:

我没有崩溃,应用程序运行正常。 有些事情我不明白。当我从AppStore下载我们最新的应用程序时,启动它,当我从xCode构建我最新的开发应用程序(使用新的数据模型)而不是AppStore中的应用程序时,不会发生迁移。

但是当我使用GIT时,当我将HEAD放到最新版本的TAG中时,构建,启动App。然后将HEAD放回我最新的开发功能(使用新的datamodel等),构建并运行,迁移完成,一切正常。

那么我应该相信哪种情况?

1 个答案:

答案 0 :(得分:0)

是的,你应该相信第二个senario通过将coredata迁移应用到最后发布的代码来测试它。 第一个senario不再有效,因为Apple出于某些安全原因而无法直接使用xcode更新itune下载的应用程序。

有一种方法可以测试itune-version上的升级,但不是直接来自xcode。

Technical Note TN2285 Testing iOS App Updates

  

安装更新的归档版本的临时分发   在已有旧版应用程序的设备上使用iTunes   安装。

Installing Your App on Test Devices Using iTunes