2015-12-07 3 views
1

Я понятия не имею, как комбинировать предикат на основе пользовательского выбора. Вот обзор моих данных.RealmSwift + множественный предикат

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", "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") 
} 
+0

Вам нужно будет создать составной оператор в вашем запросе, используя OR здесь ... – Shripada

+0

, но если мы не знаем, что пользователь будет выбирать, как мы их объединяем? – Delonn

+0

Идея состоит в том, чтобы иметь столько подвыражений, сколько есть вариантов. И в зависимости от выбранной опции составьте окончательный запрос, используя OR. См. Подсказку. – Shripada

ответ

11

Вы не должны динамически обрабатывать строку запроса NSPredicate. Гораздо проще (и безопаснее) создать программный код NSCompoundPredicate. Вы можете пройти NSPredicate s до метода Realm's RealmCollectionType.filter(...). Вот пример, чтобы получить все Person S, которые имеют либо 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) 

Хотя в вашем случае, вы могли бы быть лучше использовать IN запрос, если вы хотите OR семантику:

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

Большое вам спасибо за ответ! Это то, что мне нужно для пропавшей головоломки :) – Delonn

Смежные вопросы