iOS Realm过滤关系列表中的对象

Dan*_*rch 15 realm ios swift

我有三个通过列表嵌套的对象,如下所示:

class Canteen: Object {

        dynamic var name: String?
        let lines = List<Line>()
}

class Line: Object {

        dynamic var name: String?
        let meals = List<Meal>()
}

class Meal: Object {

        dynamic var name: String?
        dynamic var vegan: Bool = false
}
Run Code Online (Sandbox Code Playgroud)

获得所有线路和餐点的所有食堂都没有问题.我现在正在做的是:

let predicate = NSPredicate(format: "name == %@", selectedCanteenType.rawValue)
canteens =  realm.objects(Canteen).filter(predicate)
Run Code Online (Sandbox Code Playgroud)

但现在我只需要素食主义者的饭菜.因此,我希望获得所有线路的选定食堂,但只有纯素食品.这是否可以在领域中筛选检索到的对象中的列表?

Tho*_*yne 25

Realm没有深度过滤视图的任何概念,因此您不能将相关对象中包含Results<Canteen>Lists 限制为纯素餐.

你可以做几件类似的事情.您可以添加反关系属性,然后查询Meal对象:

class Canteen: Object {
    dynamic var name: String?
    let lines = List<Line>()
}

class Line: Object {
    dynamic var name: String?
    let meals = List<Meal>()
    let canteens = LinkingObjects(fromType: Canteen.self, property: "lines")
}

class Meal: Object {
    dynamic var name: String?
    dynamic var vegan: Bool = false
    let lines = LinkingObjects(fromType: Line.self, property: "meals")
}

let meals = realm.objects(Meal).filter("vegan = true AND ANY lines.canteens.name = %@", selectedCanteenType.rawValue)
Run Code Online (Sandbox Code Playgroud)

(或者更确切地说,你将能够在Realm 0.102.1出局时;目前崩溃了).

如果你只需要迭代吃饭但需要从食堂下来,你可以这样做:

let canteens = realm.objects(Canteen).filter("name = %@ AND ANY lines.meals.vegan = true", selectedCanteenType.rawValue)
for canteen in canteens {
    for line in canteen.lines.filter("ANY meals.vegan = true") {
        for meal in line.meals.filter("vegan = true") {
            // do something with your vegan meal
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,由于需要为每个级别的引用重复过滤器,因此存在一些重复.