我正在尝试执行一个提取请求来检查两件事。
这是我的数据:
人 - 实体 声明 - 实体 Person 实体与语句的关系为 To Many。报表实体有一个名为 amountOwed 的属性。这是我要在谓词中检查的属性。
编辑 我想做的是这个。 检查我所有的 Persons 实体的名称,比方说 Bob。
找到 Bob 实体后,我想检查他的所有 Statement 实体是否有一个名为 amountOwed 的属性,看看它是大于还是小于 0。
- 检查个人实体中的名称。当该名称匹配时,使用该实体。
- 检查 Statement 实体中的 amountOwed 是否大于或小于 0。
这就是我一直在努力开始工作的东西。
let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
fetchRequest.predicate = NSPredicate(format:"name == %@ AND @statement.amountOwed >= 0", personName))
let sort = NSSortDescriptor(key: #keyPath(Person.name), ascending: true)
fetchRequest.sortDescriptors = [sort]
positiveFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: coreDataStack.managedContext, sectionNameKeyPath: nil, cacheName: nil)
do {
try positiveFetchedResultsController.performFetch()
} catch let error as NSError{
print("Fetching error: \(error), \(error.userInfo)")
}
我收到这个错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'
我在这里找到了 AND 方法:using AND link
最佳答案
您应该构建您的 FRC 以获取 Statement
对象,而不是 Person
对象:
let fetchRequest: NSFetchRequest<Statement> = Statement.fetchRequest()
假设 statement
关系有一个名为 person
的反向(一对一)关系,那么您可以使用以下谓词来确保您只获取具有肯定的语句amountOwed
与具有给定名称的人有关:
fetchRequest.predicate = NSPredicate(format:"person.name == %@ AND amountOwed >= 0", personName)
(对于负的 amountOwed
也是类似的)。指定排序描述符以获得您想要的任何排序顺序。然后,您的 FRC 的 fetchedObjects
数组将包含可用于填充 TableView 的 Statement
对象:第 0 部分的正 FRC 和第 1 部分的负 FRC(反之亦然) ).
注意。因为您正在获取 Statement
对象,所以只用一个 FRC 就可以实现您想要的 - 但前提是您对按 amountOwed
(升序)排序的语句感到满意或降序)。如果您希望这样做,我可以提供更多详细信息。
关于ios - 将 2 个值组合成一个 NSPredicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41316066/