RealmSwift + 多谓词
RealmSwift + Multiple Predicate
我不知道如何根据用户 selection 组合谓词。这是我的数据概览。
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" 组成。我创建了一个复选框过滤选项,以允许用户select编辑他们想要过滤的选项并显示拥有哪个控制台的人的姓名。
例如,如果他们 select 同时 "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
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)
Swift 5
多重谓词
将谓词与 NSCompoundPredicate:
组合在一起
let predict = NSPredicate.init(format: "console == %@", "Xbox")
let predict2 = NSPredicate.init(format: "console == %@", "Playstation 4")
let query = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.or, subpredicates: [predict,predict2])
let player = realm.objects(Person).filter(query)
我不知道如何根据用户 selection 组合谓词。这是我的数据概览。
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" 组成。我创建了一个复选框过滤选项,以允许用户select编辑他们想要过滤的选项并显示拥有哪个控制台的人的姓名。
例如,如果他们 select 同时 "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
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)
Swift 5
多重谓词
将谓词与 NSCompoundPredicate:
let predict = NSPredicate.init(format: "console == %@", "Xbox")
let predict2 = NSPredicate.init(format: "console == %@", "Playstation 4")
let query = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.or, subpredicates: [predict,predict2])
let player = realm.objects(Person).filter(query)