使用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。
如果需要自定义比较,可以自己重写==
函数。
编辑:我不认为这可以用Realm
s过滤方法来完成。但是,如果您不介意作为结果而不是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/