添加新属性时,CoreData无法解决问题

时间:2010-03-11 21:12:55

标签: iphone core-data

尝试访问新数据模型中的新属性时,我收到“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;
}

这仍然没有解决我的问题。我干净并重建,但仍然没有爱。

2 个答案:

答案 0 :(得分:2)

您是如何构建NSManagedObjectModel的?如果您传递的是一个特定的文件,可能会导致您的问题,因为您可能正在加载旧的原始妈妈文件,该文件在您的项目中挥之不去。理想情况下,您现在应该使用以下方法加载momd包或只是从您的包中加载所有编译的模型:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

如果收到错误,则表示您需要清理项目以摆脱过时的编译模型。

更新

由于这不是一个旧的模型问题,我们转向下一个可能性。在plist中未正确设置版本。要检查这一点,请使用取景器或终端,查看妈妈束内部并打开其中的夹子。检查确认新模型确实已设置为当前版本。

假设不起作用,接下来在模拟器中运行您的应用程序并在创建MOC后立即保存。之后,使用命令行工具打开sqlite3文件并检查架构以查看它是否已更新到新结构。

假设设置正确,您使用的是自定义NSManagedObject子类吗?

答案 1 :(得分:2)

事实证明版本控制没有问题。我有一些相当(太)复杂的逻辑,它从模型中删除了我的对象,然后我尝试访问它。

+1给Marcus的额外调试指针,它们无疑会在某些方面派上用场。