gpt4 book ai didi

Android -room 持久库 - DAO 调用是异步的,因此如何获取回调?

转载 作者:IT老高 更新时间:2023-10-28 23:33:03 26 4
gpt4 key购买 nike

根据我的阅读 Room 不允许您在主线程上发出数据库查询(因为可能会导致主线程延迟)。 所以想象一下我正在尝试更新 textview在 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);

}

现在在某些 Activity 中,我有一个 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。

最佳答案

如果您想同步执行查询而不接收数据集更新通知,请不要将返回值包装在 LiveData 对象中。查看来自 Google 的示例代码。

看看loadProductSync() here

关于Android -room 持久库 - DAO 调用是异步的,因此如何获取回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44293066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com