swift - Realm 查询嵌套对象

标签 swift realm

大家好,我在使用嵌套对象查询归档一件事情时遇到了困难。我有两个 Realm 对象 Championship 和 Game。

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"
    }

}

基本上我想检索所有比赛状态为“进行中”的锦标赛,所以我要做的是存档:

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

该查询所做的是为我提供所有至少有一场比赛处于该状态的锦标赛,但也为我提供了该锦标赛的所有比赛,但实际上我只想要状态为“进行中”的比赛。

有什么办法吗?

最佳答案

您可以在这里采用两种方法。如果您希望所有游戏都具有 inprogress 状态,您可以这样写:

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

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

如果你想要每场比赛都在进行中的锦标赛,你可以这样写:

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

这将返回 Championship 数组,其中每场比赛都在进行中

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

关于swift - Realm 查询嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425544/

相关文章:

swift - 自定义属性的可读显示 (IB) 名称

android - 对象不是 Kotlin 中此 Realm 的模式的一部分

ios - 不要将 Realm 对象映射到 Realm 表中

android - Realm Kotlin 迁移 Android String

ios - 将 `Executing` 状态中的操作添加为对另一个状态的依赖

ios - 后台获取和核心位置与时间表

ios - 无 nibles UIView 子类的里氏替换原则

Swift 使用 NSTimer 时无法输出

ios - 如何解决 'Object has been deleted or invalidated.' Realm 异常

swift - Realm :Swift `let` 属性不能标记为动态