首页 > 解决方案 > 使用主键列表过滤从领域中查询多个对象

问题描述

我正在尝试使用主键字符串列表从领域查询多个对象。我知道我可以使用 for..in 循环来做到这一点,但如果可能的话,我宁愿使用过滤器。

primaryKeyArray 包含多个字符串

class Item : Object {
    @objc dynamic var itemKey = NSUUID().uuidString
}

var primaryKeyArray : List<String>?

//Assume Realm DB already contains multiple Item Objects 
//primaryKeyArray contains "key1", "key2", "key3", etc..

let predicate = NSPredicate(format: "itemKey == %@", primaryKeyArray)

let items = realm.objects(Item.self).filter(predicate)

我知道问题出在我的谓词格式上。不确定是否使用某种形式的 CONTAINS 或什么?任何有关谓词语法的帮助将不胜感激!

标签: swiftlistrealm

解决方案


我想你是在问如何在领域中查询具有与数组中的一组键匹配的键的项目。

所以给定一个 DogClass 领域对象

class DogClass: Object {
    @objc dynamic var dog_id = NSUUID().uuidString
    @objc dynamic var dog_name = ""

    override static func primaryKey() -> String? {
        return "dog_id"
    }
}

假设我们知道我们想要检索与某些给定主键匹配的三只狗

let keysToMatch = ["302AC133-3980-41F3-95E8-D3E7F639B769", "54ECC485-4910-44E5-98B9-0712BB99783E", "71FE403B-30CD-4E6C-B88A-D6FDBB08C509"]
let dogResults = realm.objects(DogClass.self).filter("dog_id IN %@", keysToMatch)
for dog in dogResults {
    print(dog.dog_id, dog.dog_name)
}

请注意在过滤器中使用 IN,它将匹配给定数组中具有 id 的任何狗。

你也可以传入 Realm List Object 而不是 Swift 数组并获得相同的结果。

let listOfKeysToMatch = List<String>()
listOfKeysToMatch.append("302AC133-3980-41F3-95E8-D3E7F639B769")
listOfKeysToMatch.append("54ECC485-4910-44E5-98B9-0712BB99783E")
listOfKeysToMatch.append("71FE403B-30CD-4E6C-B88A-D6FDBB08C509")
let dogResults2 = realm.objects(DogClass.self).filter("dog_id in %@", listOfKeysToMatch)
for dog in dogResults2 {
    print(dog.dog_id, dog.dog_name)
}

推荐阅读