使用Realm Swift考虑以下问题:

class Shelf : Object {
    let products = List<Product>()
}


class Product : Object {
    let string: String = ""
    let Shelves = LinkingObjects(fromType: Shelf.self, property: "products")
}

现在的问题是,是否可以执行如下查询:
“与特定产品列表完全匹配的所有货架是什么?”(不多,不少)。
我找不到比较数组的方法。
编辑:
如果我尝试这样做:
let results = realm.objects(Shelf.self).filter("%@ == products",products)

我知道错误:
Invalid predicate:
Key paths that include an array property must use aggregate operations

谢谢您。

最佳答案

默认情况下,继承自Object的每个领域模型类都符合Equatable协议,因为Object继承自NSObject,这符合Equatable。如果aList的元素符合Equatable协议,List本身也符合它。
因此,您应该能够使用List<Product>函数比较==实例,还可以直接比较Shelf对象。
但是,请注意Realm会覆盖==函数,请参见Realm object's Equatable is implementation
如果需要自定义比较,可以自己重写==函数。
编辑:我不认为这可以用Realms过滤方法来完成。但是,如果您不介意作为结果而不是Result集合取回数组,下面的方法可以帮助您。

let searchedProducts = List([product1, product2, product3])  //these are Product instances
let results = Array(realm.objects(Shelf.self)).filter{
    if $0.products.count != searchedProducts.count {
        return false
    }
    for product in $0.products {
        if searchedProducts.index(of: product) == nil {
            return false
        }
    }
    return true
}

上面的代码已经用类似的类在Playground中进行了测试,并返回了正确的结果。

关于swift - 在Realm中查询匹配的数组属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44830118/

10-11 22:27
查看更多