在 swift 中,在使用复合谓词的获取结果控制器中找不到实体的键路径

In swift, keypath not found for entity in fetched results controller with compound predicates

对于 NSFetchedResultsController,我试图创建一个满足 3 个可能的双重条件中的任何一个的请求 (1 AND "Masculine") OR (2 AND "Masculine") OR (3 AND "Masculine"). 1、2、3 是存储的列整数,"Masculine" 从 CellData 实体到 Gender.text 的一对一关系的值(.text 已编入索引)。

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

但是 - 我收到一个错误:在实体

中找不到键路径 cellData.gender.text

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

最初,cellData.gender.text 谓词是用与数据库中现有值相匹配的值定义的:

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) 复合成相应的列和 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 在 userInfo 为 (null)

的实体中找不到

但是 cellData.gender 在 CoreData 中:

还有gender.text:

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

您正在创建 NSFetchedResultsController 以从 CellData 请求数据,因此键路径应该仅为 gender.text

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

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

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

不应该是1而不是0还是题中的文字有误?