在 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还是题中的文字有误?
对于 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还是题中的文字有误?