我已经使用实体继承设置了我的核心数据模型(A是X和Y的父实体)。通过执行获取请求,我有一个谓词来过滤子实体(X)的属性。
这是我的获取请求:
func fetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "A")
let predicate = NSPredicate(format: "test == %@", "123")
fetchRequest.predicate = predicate
fetchRequest.includesSubentities = true
return fetchRequest
}
注意:"测试"是X的属性。
现在,当我尝试添加一个新的子项(类型为Y)时,我的应用程序崩溃了,引发了以下错误:
CoreData:错误:严重的应用程序错误。在Core Data更改处理期间捕获到异常。这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误。并[d ...> valueForUndefinedKey:]:实体Y不是密钥值编码兼容的密钥" test"。与userInfo {...} NSUnknownUserInfoKey = test;
答案 0 :(得分:1)
您正在获取的实体(“A”及其子实体)与谓词之间存在不匹配,谓词正在测试仅存在于其中一个子实体(“X”)上的属性。
当你只有“X”时,一切都很好,但是一旦你创建了一个“Y”对象,FRC就会看到它,检查实体是否匹配它的底层提取(它是这样做的,因为“Y”是“A”的子实体。然后测试“Y”对象是否与谓词匹配,并发现它没有test
属性。因此它抛出异常。
由于只有“X”对象可以匹配谓词,因此您应该修改fetch以使用“X”实体:
let fetchRequest = NSFetchRequest(entityName: "X")
答案 1 :(得分:0)
该错误通常是由于NSFetchedResultsControllerDelegate
或其中一个核心数据更改的观察者崩溃造成的。您应该添加转到断点导航器(Command-7),单击断点导航器区域底部的小加号,然后选择"添加异常断点..."。这会导致调试器在抛出异常时暂停应用程序,因此您可以明确地看到哪一段代码存在问题。
答案 2 :(得分:0)
对于那些对可能的解决方案感兴趣的人: 我通过删除fetchRequest谓词并创建自己的过滤器函数来避免这个问题。