将2个值组合成NSPredicate

时间:2016-12-24 18:57:15

标签: ios xcode core-data swift3 nspredicate

我试图执行检查2件事的获取请求。

这是我的数据:

人 - 实体 声明 - 实体 Person实体与To Many的语句有关系。语句实体有一个名为amountOwed的属性。这是我要在谓词中检查的属性。

修改 我想要做的就是这个。 检查我的所有人员实体的名称,让我们说鲍勃。

一旦找到Bob实体,我想检查他的所有Statement实体中是否有一个名为amountOwed的属性,看看它是否大于或小于0.

  1. 检查人员实体中的名称。当该名称匹配时,请使用该实体。
  2. 检查Statement实体中的amountOwed是否大于或小于0.
  3. 这就是我一直想要的工作。

    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

    修改 enter image description here

2 个答案:

答案 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必须是您附加的示例的字符串的一部分...