1

我在我的 iOS 项目中使用核心数据。我正在使用轻量级迁移在数据模型版本之间迁移模式。我将 3.5 版设置为在现场发布的应用程序的当前模式版本。在对数据模型模式进行新更改之前,我创建了一个新的数据模型版本 3.6,并在新数据模型上添加了一个新实体和几个属性更新。完成所有更改后,我为 3.5 到 3.6 创建了一个新的映射模型,并且我正在使用以下代码进行轻量级迁移,

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil)
{
    return _persistentStoreCoordinator;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:PERSISTENT_STORE_FILENAME];
NSDictionary *storeOptions = nil; 

NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:storeOptions error:&error])
{

    BOOL shouldPerformLightWeightMigration;

    if (self.optionalCoreDataMigrationHandler) {
        shouldPerformLightWeightMigration = optionalCoreDataMigrationHandler();
    }

    if (shouldPerformLightWeightMigration) {
        [self performLightweightMigrationInBackgroundWithStoreURL:storeURL];
    }        
}    

return _persistentStoreCoordinator;

}

- (void)performLightweightMigrationInBackgroundWithStoreURL:(NSURL *)storeURL {
[self.initializerDelegate willStartMigration];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
    NSDictionary *storeOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:storeOptions error:&error]) {
        dispatch_async(dispatch_get_main_queue(), ^(void){
            [self.initializerDelegate didFinishMigrationSuccessfully:NO];
        });
    } else {
        dispatch_async(dispatch_get_main_queue(), ^(void){
            [self.initializerDelegate didFinishMigrationSuccessfully:YES];
        });
    }
});

}

当我在现有应用程序之上安装新应用程序时,应用程序变为空白并且没有检索任何数据,并且在调用 NSManagedObjectContextDidSaveNotification 时遇到以下错误,

NSManagedObjectContextDidSaveNotification 的观察者非法抛出异常。保存的对象 = {....} 和异常 = 使用 userInfo = (null) 从这个 NSManagedObjectContext 的协调器无法访问对象的持久存储

在另一个应用程序中,相同的过程通常适用于我。但由于某种原因,它在这里不起作用。过去,我在另一个应用程序中遇到过类似的问题。从 v1 到 v2 的数据模型迁移失败,所以我创建了一个新的模型版本 v3,以 v1 为源,在 v3 上重新进行了所有数据模型更新,并创建了一个从 v1 到 v3 的新映射模型。然后轻量级迁移起作用了。

在当前情况下,我无法遵循上述方法。请帮助解决当前的迁移问题和任何其他最佳实践,以避免将来出现此类问题,因为我经常更新数据模型。

4

0 回答 0