【问题标题】:RealmSwift ALL predicateRealmSwift ALL 谓词
【发布时间】:2017-07-27 06:42:44
【问题描述】:
let selectedConsoles = ["Xbox", "Playstation 4"]
let players = realm.objects(Person).filter("consoles IN %@", selectedConsoles)

假设玩家的属性控制台是List<console>()

所以我想过滤所有同时拥有 xbox 和 playstation 4 的玩家。目前我可以通过 OR 比较来过滤它们,我的目标是实现 AND 比较,例如目前它只检查“xbox”或“playstation 4”存在于玩家的控制台中。我想退回拥有两个游戏机的玩家。 任何帮助或提示将不胜感激

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    要获得同时拥有这两种控制台的用户,您需要“和”他们。如果想要选择的那些有任何一个,您需要将它们“或”在一起。如果你“和”它们,你必须同时拥有它们,否则它不会被包括在内,如果你“或”它们,如果其中任何一个存在,它就会被包括在内。

    因此您需要创建一个复合“或”谓词。您为要包含的每个案例创建一个谓词,然后使用复合谓词将所有谓词“或” [或“和”] 一起。

    我根据您上面提供的内容进行了一些猜测,但这应该非常接近。让我知道它是否需要澄清或清理。它可以编译,但我没有为它创建测试数据集。用你的变量名(对于你的领域对象)和类名替换

        let selectedConsoles = ["Xbox", "Playstation 4"]
        let predicateOne = NSPredicate(format:"consoles IN %@", [selectedConsoles[0]])
        let predicateTwo = NSPredicate(format:"consoles IN %@", [selectedConsoles[1]])
        let compoundPredicateEitherConsole = NSCompoundPredicate(orPredicateWithSubpredicates: [predicateOne, predicateTwo])
        let compoundPredicateBothConsoles = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateOne, predicateTwo])
        let results = <realm>.objects(<YourClassName>.self).filter(compoundPredicateEitherConsole)
    

    【讨论】:

    • 谢谢我刚刚做了几乎同样的事情并且它确实有效,我发现 NSCompoundPredicate 有 LogicalType .and 。剩下的很容易做成复合谓词
    • 太棒了!很高兴你解决了!很容易忘记 NSCompoundPredicate 是可用的。当您需要时,它会派上用场。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多