我试图通过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*,artist
对artistId
的变化没有反应。
val artist = savedStateHandle.getStateFlow<String>(ARTIST_ID_SAVED_STATE_KEY)
.mapLatest { id ->
repository.getArtist(id)//suspend fun
}.distinctUntilChanged().asLiveData()