添加新属性时,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时,目标属性映射未在xcmodelmappingmodel中显示新添加的属性
使用 mergeChangesFromContextDidSaveNotification 时 CoreData 无法完成错误