按主键查询的实体与Room不匹配



我试图通过id从我的房间数据库查询实体,但没有成功。这里是我的数据库:

实体:

@Entity(tableName = "artist")
data class Artist(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val name: String,
)

资源库中:

@Singleton
class AppRepository @Inject constructor(
private val artistDao: ArtistDao
) {
suspend fun insert(artist: Artist) {
artistDao.insert(artist)
}
fun getArtist(id: Long) = artistDao.getArtist(id)
}

Dao:

@Query("SELECT * FROM artist WHERE id = :id")
fun getArtist(id: Long): Flow<Day>

ViewModel:

@HiltViewModel
class ArtistViewModel @Inject constructor(
private val repository: AppRepository,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val artistId: Long = 
savedStateHandle.get(ARTIST_ID_SAVED_STATE_KEY) ?: 0
fun insert(artist: Artist) = viewModelScope.launch {
repository.insert(artist)
}
val artist =
repository.getArtist(artistId).distinctUntilChanged().asLiveData()
}

观察来自viewModel的artist字段总是返回null。另一方面,当我使用Artist实体的name字段做同样的事情时,我得到一些值。我想知道在按主键查询时是否还有其他一些事情需要注意。

有两件事:

首先-你把它插入数据库:

fun insert(artist: Artist) = viewModelScope.launch {
repository.insert(artist)
//savedStateHandle[ARTIST_ID_SAVED_STATE_KEY] = artist.id
}

但不改变savedStateHandle

第二artist不会改变,因为你在视图模型创建时初始化它,其中artistId为0*,artistartistId的变化没有反应。

val artist = savedStateHandle.getStateFlow<String>(ARTIST_ID_SAVED_STATE_KEY)
.mapLatest { id -> 
repository.getArtist(id)//suspend fun
}.distinctUntilChanged().asLiveData()

最新更新