通过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> 已更新,您可以通过这种方式处理该值。

这是正确的方法,因为您是从数据库中异步获取数据。