swift - 通过将新项目保存到具有继承性的过滤提取请求,CoreData 出错

标签 swift core-data

我已经用实体继承设置了我的核心数据模型(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
}

注意:“test”是X的一个属性。

现在,当我尝试添加新的子项(类型 Y)时,我的应用程序崩溃并抛出以下错误:

CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. [<...> valueForUndefinedKey:]: the entity Y is not key value coding-compliant for the key "test". with userInfo { ... } NSUnknownUserInfoKey = test;

最佳答案

您正在获取的实体(“A”及其子实体)与谓词之间存在不匹配,谓词正在测试仅存在于一个子实体(“X”)上的属性。

当你只有“X”时一切都很好,但是一旦你创建了一个“Y”对象,FRC 就会看到它,检查实体是否匹配它的底层提取(它确实匹配,因为“Y”是“A”的子实体)。然后它测试“Y”对象是否与谓词匹配,并发现它没有 test 属性。因此它抛出异常。

由于只有“X”对象可以匹配谓词,您应该修改提取以使用“X”实体:

let fetchRequest = NSFetchRequest(entityName: "X")

关于swift - 通过将新项目保存到具有继承性的过滤提取请求,CoreData 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33270681/

相关文章:

ios - 如何最好地将巨大的 .sqlite 数据库移动到旧的低内存 iOS 设备上的新目录?

ios - 如何在我的无处不在的容器中获取所有可用的持久存储?

swift - 子查询中的 NSPredicate

ios - 搜索核心数据以获取最接近的值

swift - 如何在TableView中按Section和Row进行搜索?

ios - 如何使用查询在 swift 中获取 cloudkit 数据

ios - AVPlayer一直在后台运行我们如何停止它

ios - AppStore应用兼容性差异

ios - NSFetchedResultsControllerDelegate 与 NSFetchedResultsController

ios - swift - 如何检查 CoreData 是否存在