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

人智

class Person: Object {

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

   override static func primaryKey() -> String {
      return "id"
}

样本json数据
{
 "id": 822,
 "name": "Ron",
 "console": "XBox"
},
{
 "id": 823,
 "name": "Jenny"
 "console": "Playstation 4"
}

例如,我有很多数据,控制台由“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")
}

最佳答案

您不应该动态地编写NSPredicate查询字符串。以编程方式创建NSCompoundPredicate更加容易(更安全)。您可以将NSPredicate传递给Realm的 RealmCollectionType.filter(...) 方法。这是获取具有Xbox或Playstation 4的所有Person的示例:

// 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)

尽管在您的情况下,如果您想要IN语义,则最好使用OR查询:
let selectedConsoles = ["Xbox", "Playstation 4"]
let player = realm.objects(Person).filter("console IN %@", selectedConsoles)

07-24 20:52