2015-12-07 25 views
1

我不知道如何结合基于用户选择的谓词。这里是我的数据的概述。RealmSwift + Multiple Predicate

Person.swift

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” 的, “游戏机4”, “Wii的”, “世嘉”或“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") 
} 
+0

您需要在您的查询中使用OR在这里创建一个复合语句... – Shripada

+0

但是如果我们不知道用户将选择什么,我们如何复合它们? – Delonn

+0

这个想法是有尽可能多的子表达式,因为有选项。并根据选定的选项使用OR组合最终查询。请看指导答案。 – Shripada

回答

11

您不应该动态创建NSPredicate查询字符串。以编程方式创建NSCompoundPredicate会更容易(也更安全)。您可以将NSPredicate s传递给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) 

虽然你的情况,如果你想OR语义,你可能会更好使用IN查询:

let selectedConsoles = ["Xbox", "Playstation 4"] 
let player = realm.objects(Person).filter("console IN %@", selectedConsoles) 
+0

非常感谢你的答案!这是我需要的缺少谜题:) – Delonn