RealmSwift + Multiple Predicate

Del*_*onn 2 predicate filter realm swift

我不知道如何根据用户选择组合谓词.以下是我的数据概述.

Person.swift

class Person: Object {

   let id = RealmOptional<Int>()
   dynamic var name = ""
   dynamic var console = ""

   override static func primaryKey() -> String {
      return "id"
}
Run Code Online (Sandbox Code Playgroud)

样本json数据

{
 "id": 822,
 "name": "Ron",
 "console": "XBox"
},
{
 "id": 823,
 "name": "Jenny"
 "console": "Playstation 4"
}
Run Code Online (Sandbox Code Playgroud)

比方说,我有很多数据和控制台包括"XBox","Playstation 4","Wii","Sega"或"PS Vita".我创建了一个复选框过滤选项,允许用户选择他们想要过滤的选项,并显示拥有哪个控制台的人的姓名.

例如,如果他们同时选择"XBox"和"Playstation 4",我如何预测它们并显示人名的结果?目前我只能显示这样一个选项.

var player: Results<Person>!

func filter(sender: AnyObject) {
    let realm = try! Realm()
    self.player = realm.objects(Person).filter("%K = %@", "console", "XBox")
}
Run Code Online (Sandbox Code Playgroud)

jps*_*sim 16

您不应动态制作NSPredicate查询字符串.以NSCompoundPredicate编程方式创建更容易(也更安全).您可以将NSPredicates 传递给Realm的RealmCollectionType.filter(...)方法.这是一个让所有Person拥有Xbox或Playstation 4的人的例子:

// could use .AndPredicateType here too, depending on what you want
let query = NSCompoundPredicate(type: .OrPredicateType, subpredicates: [NSPredicate(format: "console = 'Xbox'"), NSPredicate(format: "console = 'Playstation 4')])
let player = realm.objects(Person).filter(query)
Run Code Online (Sandbox Code Playgroud)

虽然在您的情况下,IN如果您需要OR语义,最好使用查询:

let selectedConsoles = ["Xbox", "Playstation 4"]
let player = realm.objects(Person).filter("console IN %@", selectedConsoles)
Run Code Online (Sandbox Code Playgroud)