我试图执行检查2件事的获取请求。
这是我的数据:
人 - 实体 声明 - 实体 Person实体与To Many的语句有关系。语句实体有一个名为amountOwed的属性。这是我要在谓词中检查的属性。
修改 我想要做的就是这个。 检查我的所有人员实体的名称,让我们说鲍勃。
一旦找到Bob实体,我想检查他的所有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
答案 0 :(得分:1)
您应该构建FRC来获取Statement
个对象,而不是Person
个对象:
let fetchRequest: NSFetchRequest<Statement> = Statement.fetchRequest()
假设statement
关系具有名为person
的反向(对一)关系,那么您可以使用以下谓词来确保仅提取与amountOwed
有关的语句给某个名字的人:
fetchRequest.predicate = NSPredicate(format:"person.name == %@ AND amountOwed >= 0", personName)
(同样对于否定的amountOwed
)。指定排序描述符以获得您希望的任何排序顺序。你的FRC&#39;然后,fetchedObjects
数组将包含Statement
个对象,您可以使用这些对象填充表视图:第0部分为正FRC,第1部分为负FRC(反之亦然)。
NB。因为你正在获取Statement
个对象,所以只用一个FRC就可以达到你想要的效果 - 但前提是你对按amountOwed
(升序或降序)排序的语句感到满意。如果您希望这样做,我可以提供更多详细信息。
答案 1 :(得分:0)
试试这个:
NSPredicate(format:"name == %@ AND statement.@amountOwed >= 0", personName)
AND
必须是您附加的示例的字符串的一部分...