首页 > 解决方案 > 快速,在具有复合谓词的提取结果控制器中找不到实体的键路径

问题描述

对于 NSFetchedResultsController,我正在尝试创建一个满足 3 个可能的双重条件(1 和“男性”)或(2 和“男性”)或(3 和“男性”)中的任何一个的请求。1,2,3 是存储的列整数,“阳性”是从 CellData 实体到 Gender.text 的一对一关系的值(.text 被索引)。

在此处输入图像描述

CoreData 中的数据似乎是正确的。有一个列值,性别行的 PK 值分配给 coreData.gender 关系属性(见下文)。

但是 - 我收到一个错误:keypath cellData.gender.text not found in entity

我怀疑这是我创建谓词或复合谓词的方式,因为这对我来说是新的。

最初,cellData.gender.text 谓词使用与 DB 中现有值匹配的值定义:

var col0GenderPredicate: NSPredicate = NSPredicate(format: "cellData.gender.text == %@", "Masculine")
var col2GenderPredicate: NSPredicate = NSPredicate(format: "cellData.gender.text == %@", "Masculine")
var col3GenderPredicate: NSPredicate = NSPredicate(format: "cellData.gender.text == %@", "Masculine")

在获取的结果控制器中,谓词是: 1) 为 cellData.column 值定义。2) 复合成对应的列 AND cellData.gender.text 值对。3) 进一步复合为 OR 复合谓词。

@objc private func loadSavedData()
{
    if fetchedResultsController == nil
    {
        print("creating fetchresultsController")
        let request = CellData.createFetchRequest()    
        let sortDescriptor = NSSortDescriptor(key: "sortOrder", ascending: true)    // sort by name
        request.sortDescriptors = [sortDescriptor]     
        fetchedResultsController = NSFetchedResultsController(fetchRequest: request,
                                                              managedObjectContext: container.viewContext,
                                                              sectionNameKeyPath: nil,
                                                              cacheName: nil) as? NSFetchedResultsController<NSFetchRequestResult>

// 1)
        let column0Predicate = NSPredicate(format: "column == %ld", 1)
        let column2Predicate = NSPredicate(format: "column == %ld", 3)
        let column3Predicate = NSPredicate(format: "column == %ld", 4)

// 2)   
        let col0AndGenderPredicate = NSCompoundPredicate(type: .and,
                                                         subpredicates: [column0Predicate, col0GenderPredicate])
        let col2AndGenderPredicate = NSCompoundPredicate(type: .and,
                                                                 subpredicates: [column2Predicate, col2GenderPredicate])
        let col3AndGenderPredicate = NSCompoundPredicate(type: .and,
                                                         subpredicates: [column3Predicate, col3GenderPredicate])

// 3)
        let columnAndGenderPredicate = NSCompoundPredicate(type: .or, subpredicates: [col0AndGenderPredicate, col2AndGenderPredicate, col3AndGenderPredicate])

        fetchedResultsController?.fetchRequest.predicate = columnAndGenderPredicate
        fetchedResultsController?.delegate = self
    }

    do { try fetchedResultsController?.performFetch() }
    catch { print(error.localizedDescription) }
}

然后我得到一个错误:错误:SQLCore dispatchRequest:异常处理请求:,keypath cellData.gender.text not found in entity with userInfo of (null)

但是 cellData.gender 在 CoreData 中: 在此处输入图像描述

并且gender.text也在那里: 在此处输入图像描述

其他讨论表明 FetchedResultsController 存在错误,但在我开始链接谓词之前它一直有效,我找不到任何突出问题的东西或任何可以尝试的东西。

标签: swiftcore-datanspredicatensfetchedresultscontroller

解决方案


你正在创建你的 NSFetchedResultsController 来请求数据,CellData那么 keypath 应该gender.text只是

 var col0GenderPredicate: NSPredicate = NSPredicate(format: "gender.text == %@", "Masculine")

此外,与您所写的内容和图像相比,您在这里似乎有错字

 let column0Predicate = NSPredicate(format: "column == %ld", 0)

它不应该是 1 而不是 0 还是问题中的文字错误?


推荐阅读