2015-12-07 50 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