快速,在具有复合谓词的提取结果控制器中找不到实体的键路径

Posted

技术标签:

【中文标题】快速,在具有复合谓词的提取结果控制器中找不到实体的键路径【英文标题】:In swift, keypath not found for entity in fetched results controller with compound predicates 【发布时间】:2019-07-24 10:21:24 【问题描述】:

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

CoreData 中的数据似乎正确。有一个列值,将 Gender 行的 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:异常处理请求:,在 userInfo 为 (null) 的实体中找不到 keypath cellData.gender.text

但是 cellData.gender 在 CoreData 中:

而且gender.text 也在那里:

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

【问题讨论】:

提示:Xcode 4 and Core Data: How to enable SQL Debugging 【参考方案1】:

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

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

另外,和你写的和图片相比,你这里有一个错字

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

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

【讨论】:

天哪!我不知道为什么我认为它会有所不同。关系让我害怕。我更正了问题中的列错字-谢谢。进入下一个断点!

以上是关于快速,在具有复合谓词的提取结果控制器中找不到实体的键路径的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 复合谓词

复合谓词不返回结果

StackMob iOS 关系查询

核心数据:返回另一个实体的对象的谓词

使用 NSFetchedResultsController 的子实体到父实体的谓词

如何创建谓词以获取同一属性的所有不重复结果的实体?