首页 > 解决方案 > Realm Swift - 使用 List 属性过滤对象(不止一个)

问题描述

如何使用子对象上的多个属性过滤对象。所以“找到所有有 10 岁以上男孩的父母”

class Parent: Object {

   @objc dynamic var name: String?

   let children = List<Child>()
}
class Child: Object {

   @objc dynamic var name: String?
   @objc dynamic var gender: String?
   @objc dynamic var age: Int?

}
    let filtered = realm.objects(Parent.self).filter("ANY (children.name == %@ && children.gender == %@)", "some name", "male")

这似乎不是一个有效的查询。

或者我是否必须做这样的事情,奇怪的是似乎也给出了不正确的结果——但我可能需要对此做更多的测试。

let filtered = realm.objects(Parent.self).filter("ANY children.name == %@", "some name").filter("ANY children.gender == %@", "male")

最后,似乎首先让所有符合条件的孩子然后找到这些孩子的父母工作可靠。

let matchingChildren = realm.objects(Child.self).filter("name == %@ && gender == %@)", "some name", "male")

let parentsOfMatchingChildren = realm.objects(Parent.self).filter("ANY children IN %@", matchingChildren)

标签: iosswiftrealm

解决方案


我不认为你可以ANY在这样的括号中使用复杂的表达式。您需要拆分ANY

ANY children.name == %@ && ANY children.age > %@

%@适用于对象(如字符串)。对于像年龄这样的整数,您需要使用%d

ANY children.name == %@ && ANY children.age > %d

或者,您也可以使用SUBQUERY

SUBQUERY(children, $child, $child.name == %@).@count > 0 && SUBQUERY(children, $child, $child.age >%d).@count > 0

推荐阅读