【问题标题】:RealmSwift + Multiple PredicateRealmSwift + 多个谓词
【发布时间】:2015-12-07 11:37:23
【问题描述】:

我不知道如何根据用户选择组合谓词。这是我的数据概览。

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")
}

【问题讨论】:

  • 您需要在这里使用 OR 在查询中创建复合语句...
  • 但是如果我们不知道用户会选择什么,我们该如何组合它们呢?
  • 这个想法是拥有与选项一样多的子表达式。并根据所选选项使用 OR 复合最终查询。请参阅指导答案。

标签: swift filter realm predicate


【解决方案1】:

您不应该动态制作 NSPredicate 查询字符串。以编程方式创建NSCompoundPredicate 要容易得多(也更安全)。您可以将NSPredicates 传递给Realm 的RealmCollectionType.filter(...) 方法。这是一个获取所有拥有 Xbox 或 Playstation 4 的 Persons 的示例:

// 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)

【讨论】:

  • 非常感谢您的回答!这就是我缺少的谜题所需要的:)
  • 我怎样才能得到结果而不是 ["Xbox", "Playstation 4"] ?
【解决方案2】:

斯威夫特 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多