在 NSPredicates 上结合“And”和“Or”

Posted

技术标签:

【中文标题】在 NSPredicates 上结合“And”和“Or”【英文标题】:Combining "And" and "Or" on NSPredicates 【发布时间】:2016-05-15 01:35:50 【问题描述】:

我想做这样的事情:

NSPredicate(format: "name contains[cd] %@ AND (position == %@ OR position == %@), name, position1, position2)

但是,我已经尝试过了,但我不断收到严重的 Core Data 应用程序错误。然后我尝试使用 NSCompoundPredicate,但我也不能在那里组合“AND”和“OR”。

我读过Combining 'AND' and 'OR' Condition in NSPredicate ,不同之处在于提问者想要一个子集合上的“或”,所以答案涉及一个我不想要的子查询。

我该怎么做?

【问题讨论】:

您遇到了什么错误?你试过"( name contains[cd] %@ )AND (position in %@)",name,[position1,position2]) 吗? 谢谢,这比我做的更好! 原来我错误地认为上述方法不起作用。在我尝试使用传统的 Swift 插值通过 for 循环将字符串添加到 NSPredicate 之前 - 我怀疑这会导致 Core Data 错误。然后我在尝试使用 NSCompoundPredicate 之后忘记了这是问题所在。 【参考方案1】:

我没有足够的声望发表评论。您发布的内容应该有效。发布更多代码以识别确切问题可能会有所帮助。

希望它能帮助您发现问题,我将发布一个结合了ANDOR 的工作示例:

let alice = Person(firstName: "Alice", lastName: "Smith", age: 24, position: "Up")
let bob = Person(firstName: "Bob", lastName: "Jones", age: 27, position: "Left")
let charlie = Person(firstName: "Charlie", lastName: "Smith", age: 33, position: "Right")
let quentin = Person(firstName: "Quentin", lastName: "Alberts", age: 31, position: "Down")
let people = [alice, bob, charlie, quentin]

let predicate = NSPredicate(format: "firstName contains[cd] %@ AND (position == %@ OR position == %@)", "e", "Up", "Down")
let filtered = (people as NSArray).filteredArrayUsingPredicate(predicate)

print(filtered)

// prints [Alice Smith, Quentin Alberts]

【讨论】:

以上是关于在 NSPredicates 上结合“And”和“Or”的主要内容,如果未能解决你的问题,请参考以下文章

使用 2 个 NSPredicates?

在 NSFetchRequest 上设置 2 个 NSPredicates

使用 NSPredicates 过滤 NSMutableArray

核心数据关系、NSPredicates 和 NSFetchedResultsController

复杂的 NSPredicates:比较最近对象的值

NSPredicates 和双对 n 关系