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)
| 归档时间: |
|
| 查看次数: |
3531 次 |
| 最近记录: |