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
相关产品推荐
相关产品推荐

