iOS:更新数据时出现CoreData异常

Posted

技术标签:

【中文标题】iOS:更新数据时出现CoreData异常【英文标题】:iOS: CoreData Exception when updating data 【发布时间】:2012-03-23 07:49:14 【问题描述】:

我正在尝试使用 CoreData 更新数据库中的现有记录,但在使用托管对象访问器方法时出现异常。

代码摘录:

NSManagedObjectContext *tmpManagedObjectContext = [self.fetchedResultsController managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:tmpManagedObjectContext];
[request setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"contact_id = %@", [dict objectForKey:@"contact_id"]];
[request setPredicate:predicate];

NSError *error = nil;
[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:[NSArray arrayWithObjects:@"first_name",@"sync_status",nil]];

Contact *contact = [[managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:0];
contact.sync_status = @"Y";

error = nil;
if (![tmpManagedObjectContext save:&error]) 
    NSLog(@"Error setting sync status on contact record - error: %@", [error localizedDescription]);

导致错误的行是:

contact.sync_status = @"Y";

错误是 * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSKnownKeysDictionary1 setSync_status:]:无法识别的选择器发送到实例 0x8907fd0” * 首先抛出调用栈:

Contact 是我在 Xcode 中自动生成的 NSManagedObject 类。

我的方法在这里不正确吗?我在检索或删除记录方面没有遇到任何问题,但我对如何更新数据感到困惑。

任何指导或帮助将不胜感激。谢谢。

【问题讨论】:

在调试器中查看您的contact 对象,它看起来不是您认为的类型。 【参考方案1】:

您已将获取请求配置为返回字典而不是托管对象。如果你想更新返回的对象,你必须在 fetch 请求中请求它们——也就是说,使用默认行为而不是你正在做的事情。

删除这些行:

[request setResultType:NSDictionaryResultType];
[request setPropertiesToFetch:[NSArray arrayWithObjects:@"first_name",@"sync_status",nil]];

你会没事的。如果您只想在 fetch 中返回某些属性,但想要整个对象,则使用上面的行。

【讨论】:

以上是关于iOS:更新数据时出现CoreData异常的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 H2 数据库更新 JDBC ResultSet 时出现异常

调用核心数据操作时出现“未能及时更新场景”消息崩溃

使用 NSPredicate 从 NSFetchedResultscontroller 更新 NSManagedObject 时出现 CoreData 错误

尝试将项目添加到数据库时出现更新条目错误

JSON转换时出现异常

Xcode Firebase I 更新 Firebase 数据库值时出现问题