关系列表中的 iOS Realm Filter 对象

标签 ios swift realm

我通过这样的列表嵌套了三个对象:

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
}

搞定所有食堂所有的线路和饭菜是没有问题的。我现在正在做的是:

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

但现在我只需要素食。所以我希望获得所有线路的选定食堂,但仅限于纯素餐点。这在现实中是否可能过滤检索到的对象中的列表?

最佳答案

Realm 没有任何深度过滤 View 的概念,所以你不能有 Results<Canteen>这限制了 List s 包含在与素食相关的元素中。

您可以执行几项类似的操作。您可以添加反向关系属性,然后查询 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)

(或者更确切地说,一旦 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
        }
    }
}

不幸的是,由于需要为每个级别的引用重复过滤器,因此有一些重复。

关于关系列表中的 iOS Realm Filter 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37193959/

相关文章:

ios - 警告 : 'libsystem_network' contains a debug script

iphone - cocos2d FPS 在视网膜上一半的原因?

ios - 监控大量(50000+)区域的最佳方式

ios - SpriteKit - touchesMoved 调用不够频繁 - 快速移动

swift - xcode 6 无法使用类型为 'stringFromDate' 的参数列表调用 '(NSData)'

iphone - 从没有文件扩展名的服务器下载图像(NSData 到 UIImage)

ios - Swift 4 - 如何覆盖选项卡栏将打开 View Controller

ios - 在 Realm 迁移中使用新属性的默认值

ios - "Thread 1: signal SIGABRT"与 Realm 和 Swift

swift - 从 Realm 数据库中删除对象。