领域 Swift - 按 ID 查找

Realm Swift - Find by IDs

我需要使用 id 列表查询 Realm 对象,id 是对象的主键。我尝试了以下方法:

// Query a list of Dogs by their _ids
let doggoIds = ["1", "2", "3", "1", "2"]
realm.objects(Dog.self).filter("_id IN %@", doggoIds)
// Result: [Dog1, Dog2, Dog3]

id 列表包含重复项,但如您所见,结果是一个唯一的 Dog 对象列表。

我想知道是否有人可以想出一种不同的方式来编写此查询,以便我们从包含重复项的 ID 列表中获得一个很好的 Results<Dog> 集合。谢谢!

Realm.objects().filter return 是 "live" 托管对象的列表。它不会 return 重复,因为只有一个对象匹配主键。为了完成你想要的,你需要为每个对象创建一个'unmanaged'副本,并制作你自己的那些非托管对象的数组映射每个return将实例编辑到您自己的数组中。

阿拉:

let doggoIds = [1, 2, 3, 1, 2]
    for managedMuttId in doggoIds {
        if let managedMutt = realm.object(ofType: Dog.self, forPrimaryKey: managedMuttId) {
            // unmanaged.append(Dog(value: managedMutt))
            duplicateList.append(managedMutt)
        }
    }

Realm 结果包含独特的对象,因此最简单的解决方案是查询每只狗并将结果添加到数组中。 CompactMap 做得很好,因为它过滤掉了 nil。

let listOfDogsToFind = ["Fido", "Dino", "Sport", "Fido", "Cupid"]

let dogArray = listOfDogsToFind.compactMap { dogName -> DogClass? in
    if let result = realm.objects(DogClass.self).filter("dog_name == %@", dogName).first {
        return result
    }
    return nil
}

for dog in dogArray {
    print("dog name: \(dog.dog_name)")
}

假设丘比特不存在,这是输出

dog name: Fido
dog name: Dino
dog name: Sport
dog name: Fido