添加新属性时,CoreData 无法完成错误

Posted

技术标签:

【中文标题】添加新属性时,CoreData 无法完成错误【英文标题】:CoreData could not fulfill a fault when adding new attribute 【发布时间】:2010-03-11 21:12:55 【问题描述】:

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

这仍然没有解决我的问题。我已经清洁和重建,但仍然没有爱。

【问题讨论】:

【参考方案1】:

你是如何构建你的NSManagedObjectModel的?如果您传递给它的特定文件可能会导致您的问题,因为您可能正在加载在您的项目中徘徊的较旧的原始 mom 文件。理想情况下,您现在应该加载 momd 包或仅使用以下命令从您的包中加载 所有 编译模型:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

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

更新

由于这不是旧模型问题,我们转向下一个可能性。 plist 中的版本设置不正确。要检查这一点,请使用 finder 或终端并查看 momd 包的内部并打开其中的 plist。检查以确认新模型确实设置为当前版本。

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

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

【讨论】:

感谢 Marcus 的回复,这就是我最初拥有的内容,并且自从阅读后我应该将其更改为我刚刚在原始帖子中更新的内容。一切似乎都可以加载广告获取,只是当我尝试访问我的新属性时才遇到问题。 +1 感谢 Marcus 的帮助(感谢 cimgf.com,这对我来说是一个很好的资源)【参考方案2】:

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

+1 给 Marcus 以获得额外的调试指针,它们无疑会在某些时候派上用场。

【讨论】:

以上是关于添加新属性时,CoreData 无法完成错误的主要内容,如果未能解决你的问题,请参考以下文章

添加新模型版本后Coredata找不到模型

未显示新的 CoreData 版本属性

迁移Coredata时,目标属性映射未在xcmod​​elmappingmodel中显示新添加的属性

使用 mergeChangesFromContextDidSaveNotification 时 CoreData 无法完成错误

更新CoreData模型版本时如何为实体的新属性设置默认值

操作无法完成。 (可可错误 1560。)