领域查询嵌套对象

时间:2016-09-10 11:23:39

标签: swift realm

大家好,我在使用嵌套对象查询归档一件事时遇到了困难。我有两个领域对象锦标赛和比赛。

class Championship: Object {
    dynamic var id: Int = 0
    dynamic var name: String = ""
    let games = List<Game>

    override static func primaryKey() -> String? {
       return "id"
    }

}

class Game: Object {
    dynamic var id: Int = 0
    dynamic var homeTeamName: String = ""
    dynamic var awayTeamName: String = ""
    dynamic var status: String = "" //"inprogress", "finished", "scheduled"

    override static func primaryKey() -> String? {
       return "id"
    }

}

基本上我想要检索所有拥有状态为“inprogress”的游戏的锦标赛,所以我要归档的是:

let realm = try! Realm()
realm.objects(Championship.self).filter("ANY games.status = 'inprogress'")

这个查询正在做的是给我所有至少有一个具有该状态的比赛的冠军,但也给了我所有的比赛,但实际上我只是希望比赛具有“进步”状态。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

你可以在这里采取两种方法。如果您想要所有具有inprogress状态的游戏,您可以写下:

let inProgressGames = realm.objects(Championship.self)
                           .flatMap { $0.games }
                           .filter { $0.status == "inprogress" }

这将返回[Game]数组中正在进行的所有游戏。 flatMap用于合并所有锦标赛的所有游戏,filter用于过滤所有inProgress状态的游戏。

如果你想要每场比赛都是inprogress的锦标赛你可以写:

let inProgressChampionships = realm.objects(Championship.self).filter {
   let inProgressGames = $0.games.filter { $0.status == "inprogress"}
   return $0.games.count == inProgressGames.count
}

这将返回Championship的数组,其中每个游戏都是inprogress

除此之外,我建议使用enum作为游戏状态而不是硬编码字符串。