You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROOM数据库自动生成ID问题:赛事关联单场比赛时ID始终为0

问题解决思路

你的问题核心在于:插入Tournament到数据库时,自动生成的ID不会回写到你传入的原始Tournament对象里,所以调用generateMatchesFFA时用的还是初始值0。以下是具体解决步骤:

1. 修改Repository的插入方法,获取真实ID

首先要让insertTournament返回数据库生成的真实ID。假设你用的是Room,先修改TournamentDao的插入方法:

// 在TournamentDao.kt中
@Insert
suspend fun insertTournament(tournament: Tournament): Long // 返回插入后的行ID

再对应更新Repository中的实现:

// 在TournamentRepository.kt中
suspend fun insertTournament(tournament: Tournament): Long {
    return tournamentDao.insertTournament(tournament)
}

2. 更新ViewModel逻辑,用真实ID生成比赛

修改addTournament函数,接收返回的真实ID后再调用生成比赛的方法:

fun addTournament(tournament: Tournament) {
    viewModelScope.launch(Dispatchers.IO) {
        // 获取插入后生成的真实赛事ID
        val realTournamentId = repository.insertTournament(tournament)
        // 传入真实ID生成关联比赛
        generateMatchesFFA(realTournamentId, tournament.players)
    }
}

private suspend fun generateMatchesFFA(tournamentId: Long, playersString: String) {
    val listOfPlayers = playersString
        .trim('[', ']')
        .split(", ")
        .map { it.trim('"') }

    val size = listOfPlayers.size
    for (i in 0 until size) {
        for (j in i+1 until size) {
            singleMatchRepository.insertMatch(SingleMatch(
                player1 = listOfPlayers[i],
                player2 = listOfPlayers[j],
                tournamentId = tournamentId // 使用真实赛事ID
            ))
        }
    }
}

补充验证

确认你的Tournament数据类ID字段配置正确,确保自动生成逻辑生效:

data class Tournament(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    // 其他字段...
    val players: String
)

内容的提问来源于stack exchange,提问作者xMaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:33:31