从我读过的内容来看,Room 不允许您在主线程上发出数据库查询(因为可能会导致主线程延迟)。 所以想象一下我正在尝试更新 UI 主线程上的文本视图,其中一些数据我将如何获得回调。让我给你看一个例子。想象一下,我想将我的业务模型数据存储到一个名为 Events 的对象中。因此我们会有一个 EventDao 对象:
假设我们在下面有这个 DAO 对象:
@Dao
public interface EventDao {
@Query("SELECT * FROM " + Event.TABLE_NAME + " WHERE " + Event.DATE_FIELD + " > :minDate" limit 1)
LiveData<List<Event>> getEvent(LocalDateTime minDate);
@Insert(onConflict = REPLACE)
void addEvent(Event event);
@Delete
void deleteEvent(Event event);
@Update(onConflict = REPLACE)
void updateEvent(Event event);
}
现在在某些活动中,我有一个 textview,我想更新它的值,所以我这样做:
myTextView.setText(EventDao.getEvent(someDate));/*i think this is illegal as im trying to call room dao on mainthread, therefore how is this done correctly ? would i need to show a spinner while it updates ?*/
由于获取是在主线程之外发生的,我认为我不能这样称呼它并期待顺利更新。这里最好的方法是什么?
更多信息:我想使用房间数据库作为检索模型信息的机制,而不是将其静态保存在内存中。因此,在我通过休息服务下载模型后,我可以通过数据库在本地使用该模型。
更新:所以因为我要返回一个实时数据,所以我可以这样做:
eventDao = eventDatabase.eventDao();
eventDao.getEvent().observe(this, event -> {
myTextView.setText(event.get(0));
});
这适用于非常小的东西。但想象一下我的数据库有一百万个项目。然后当我打这个电话时,检索数据会有延迟。第一次调用它时,用户会看到有延迟。如何避免这种情况?所以要明确一点,有时我不想要实时数据,我只需要在查看后更新。我需要知道该怎么做?即使它没有使用 liveData。