我在iOS项目中使用核心数据。我正在使用轻量级迁移来迁移datamodel版本之间的模式。 我将3.5版设置为应用程序的当前模态版本,该版本已在现场发布。在对datamodel架构进行新的更改之前,我创建了一个新的数据模型版本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的观察者非法抛出异常。保存的对象= {....} 和exception =使用userInfo =(null)从NSManagedObjectContext的协调器无法访问对象的持久存储
相同的过程通常适用于我在另一个应用程序。但由于某种原因,它在这里不起作用。 在过去,我在其他应用程序中遇到了类似的问题。从v1迁移到v2的Datamodel失败,因此我创建了一个新的模型版本v3,其中v1作为源,重新完成了v3上的所有datamodel更新,并创建了从v1到v3的新映射模型。然后轻量级迁移工作。
在目前的情况下,我无法遵循上述方法。 请帮助解决当前的迁移问题以及将来避免此类问题的任何其他最佳实践,因为我经常对数据模型进行更新。