尝试访问新数据模型中的新属性时,我收到“CoreData无法解决...的错误”错误消息。如果我使用新数据我没问题,但是当我尝试读取现有数据时,我得到了错误。如果属性不在原始数据中,我是否需要以不同方式处理实体?我的印象是Core Data可以为我处理这个问题。我的新属性标记为可选,带有默认值。
我创建了一个新的.xcdatamodel(并将其设置为当前版本)并更新了我的NSPersistentStoreCoordinator初始化,以便利用轻量级迁移,如下所示:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
感谢任何帮助。
更新: 经过更多的挖掘后,我将我的managedObjectModel更新为:
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
//managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
NSString *path = [[NSBundle mainBundle] pathForResource:@"< MyModel >" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
这仍然没有解决我的问题。我干净并重建,但仍然没有爱。
答案 0 :(得分:2)
您是如何构建NSManagedObjectModel
的?如果您传递的是一个特定的文件,可能会导致您的问题,因为您可能正在加载旧的原始妈妈文件,该文件在您的项目中挥之不去。理想情况下,您现在应该使用以下方法加载momd包或只是从您的包中加载所有编译的模型:
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
如果收到错误,则表示您需要清理项目以摆脱过时的编译模型。
由于这不是一个旧的模型问题,我们转向下一个可能性。在plist中未正确设置版本。要检查这一点,请使用取景器或终端,查看妈妈束内部并打开其中的夹子。检查确认新模型确实已设置为当前版本。
假设不起作用,接下来在模拟器中运行您的应用程序并在创建MOC后立即保存。之后,使用命令行工具打开sqlite3文件并检查架构以查看它是否已更新到新结构。
假设设置正确,您使用的是自定义NSManagedObject
子类吗?
答案 1 :(得分:2)
事实证明版本控制没有问题。我有一些相当(太)复杂的逻辑,它从模型中删除了我的对象,然后我尝试访问它。
+1给Marcus的额外调试指针,它们无疑会在某些方面派上用场。