Android 如果挂起的@Insert具有相同的字段值,则替换数据库行
My Room方法Android 如果挂起的@Insert具有相同的字段值,则替换数据库行,android,kotlin,android-room,Android,Kotlin,Android Room,My Room方法addMatchUid()不符合其冲突策略。请替换。它只添加相同的数据库行: 这是我的数据类: MatchedUser.kt @Entity(tableName = "matched_users") data class MatchedUser( @PrimaryKey(autoGenerate = true) val id: Int, @ColumnInfo(name = "match_id") val matchId: String ) @Dao int
addMatchUid()
不符合其冲突策略。请替换。它只添加相同的数据库行:
这是我的数据类:
MatchedUser.kt
@Entity(tableName = "matched_users")
data class MatchedUser(
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "match_id") val matchId: String
)
@Dao
interface MatchedUsersDao {
@Query("SELECT COUNT(*) FROM matched_users WHERE :matchId = match_id LIMIT 1")
suspend fun matchedBefore(matchId: String): Int
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun addMatchUid(match: MatchedUser)
}
MatchedUsersDao.kt
@Entity(tableName = "matched_users")
data class MatchedUser(
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "match_id") val matchId: String
)
@Dao
interface MatchedUsersDao {
@Query("SELECT COUNT(*) FROM matched_users WHERE :matchId = match_id LIMIT 1")
suspend fun matchedBefore(matchId: String): Int
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun addMatchUid(match: MatchedUser)
}
下面是正在执行的addMatchId()
:
val match = MatchedUser(0, matchId)
CustomApplication.database?.matchedUsersDao()?.addMatchUid(match)
我对这个问题的唯一猜测是,数据库行实际上不会重复,因为id不同。如果是这种情况,当match\u id
的值相同时,如何确保行被替换?您可以在match\u id
上添加unique
索引以获得所需的行为
@Entity(tableName = "matched_users", indices = [Index(value = ["match_id"], unique = true)])
data class MatchedUser(
@PrimaryKey(autoGenerate = true) val id: Int,
@ColumnInfo(name = "match_id") val matchId: String
)