通过ROOM中的userId获取用户
Get user by userId in ROOM
我想按 id 获取事件,但它是 return 单位。
实体:
@Dao
interface EventDao {
@Query("SELECT * FROM event_table WHERE eventId= :myeventId")
fun getEventByEventId(myeventId: Int): LiveData<Event>
}
存储库:
class EventRepository(private val eventDao: EventDao){
fun getEventById(myeventId: Int): LiveData<Event>{
return eventDao.getEventByEventId(myeventId = myeventId)
}
}
视图模型:
class EventViewModel (application: Application): AndroidViewModel(application) {
private val readEventById = MutableLiveData<LiveData<Event>>()
fun getEventById(eventId: Int) {
viewModelScope.launch(Dispatchers.IO) {
readEventById.postValue(eventRepository.getEventById(eventId))
}
}
}
我在用户片段上调用它:
lifecycleScope.launch {
val event = eventViewModel.getEventById(currentUserId)
}
但它是 return 单位。我如何通过 userId return 事件?
我们可以使用 withContext 从协程范围返回值,它是文档中的定义:“使用给定的协程上下文调用指定的暂停块,暂停直到完成,然后 returns 结果。”有关详细信息,请访问文档 withContext
在你的情况下你可以这样使用
suspend fun getEventById(eventId: Int): LiveData<Event> {
return withContext(Dispatchers.IO) {
eventRepository.getEventById(eventId)
}
}
在您的 ViewModel
class 中,您应该包含一个 public LiveData<Event>
值,returns readEventById
实时数据对象:
val selectedEvent: LiveData<Event>
get() = readEventById
然后,在用户 Fragment
中,您应该在 eventViewModel.selectedEvent
上添加一个 Observer
。当您调用 eventViewModel.getEventById(currentUserId)
时,您不必担心结果。相反,Observer
会让您知道 LiveData<Event>
已更新,您可以通过这种方式处理该值。
这是正确的方法,因为您是从数据库中异步获取数据。
我想按 id 获取事件,但它是 return 单位。
实体:
@Dao
interface EventDao {
@Query("SELECT * FROM event_table WHERE eventId= :myeventId")
fun getEventByEventId(myeventId: Int): LiveData<Event>
}
存储库:
class EventRepository(private val eventDao: EventDao){
fun getEventById(myeventId: Int): LiveData<Event>{
return eventDao.getEventByEventId(myeventId = myeventId)
}
}
视图模型:
class EventViewModel (application: Application): AndroidViewModel(application) {
private val readEventById = MutableLiveData<LiveData<Event>>()
fun getEventById(eventId: Int) {
viewModelScope.launch(Dispatchers.IO) {
readEventById.postValue(eventRepository.getEventById(eventId))
}
}
}
我在用户片段上调用它:
lifecycleScope.launch {
val event = eventViewModel.getEventById(currentUserId)
}
但它是 return 单位。我如何通过 userId return 事件?
我们可以使用 withContext 从协程范围返回值,它是文档中的定义:“使用给定的协程上下文调用指定的暂停块,暂停直到完成,然后 returns 结果。”有关详细信息,请访问文档 withContext
在你的情况下你可以这样使用
suspend fun getEventById(eventId: Int): LiveData<Event> {
return withContext(Dispatchers.IO) {
eventRepository.getEventById(eventId)
}
}
在您的 ViewModel
class 中,您应该包含一个 public LiveData<Event>
值,returns readEventById
实时数据对象:
val selectedEvent: LiveData<Event>
get() = readEventById
然后,在用户 Fragment
中,您应该在 eventViewModel.selectedEvent
上添加一个 Observer
。当您调用 eventViewModel.getEventById(currentUserId)
时,您不必担心结果。相反,Observer
会让您知道 LiveData<Event>
已更新,您可以通过这种方式处理该值。
这是正确的方法,因为您是从数据库中异步获取数据。