使用 LiveData 时检查 RoomDatabase 是不是为空

Posted

技术标签:

【中文标题】使用 LiveData 时检查 RoomDatabase 是不是为空【英文标题】:Checking if RoomDatabase is empty while using LiveData使用 LiveData 时检查 RoomDatabase 是否为空 【发布时间】:2018-07-17 02:40:13 【问题描述】:

我正在尝试在我的 android 应用中使用 RoomDatabase。我正在使用LiveData 能够在我的片段中自动刷新我的更改。

我第一次运行我的应用程序时,我从 API 获取数据,创建我的 RoomDatabase 并存储我的数据。

第二次运行我的应用程序时,我想检查我的数据库是否为空。但是在使用LiveData时:下面的代码返回null。

AppDatabase.getInstance(getContext()).getRecipeDao().getAllRecipes().getValue();

我读到“如果响应是可观察的数据类型,例如 Flowable 或 LiveData,Room 会监视查询中引用的所有表是否失效”。

如何检查我的 RoomDatabase 是否有数据或为空?

【问题讨论】:

getValue() 调用返回 null? 是的..即使我已经填满了我的数据库。 好的,您阅读了下面的说明。我尝试在不添加观察者的情况下实现,并且我的 getValue() 也返回 null。一旦我添加了观察者,我就能够正确地从数据库中获取值。 【参考方案1】:

所以在实现了自己之后,我发现你需要做一些事情:

    确保您有 Observer 以更改 LiveData 您需要调用observeForever(Observer<T> observer),除非您使用的是LiveCyclerOwner,然后使用它来代替:observe (LifecycleOwner owner, Observer<T> observer) 最后,getValue()上有个有趣的注释:

返回当前值。请注意,在 后台线程不保证最新的值集将是 收到了

所以重申一下,我认为你的方法行不通。

您需要创建某种类型的单独检查,而不是使用返回 LiveData 类的方法,因为它不能保证通过调用 getValue() 接收到最新的值集。

最后我会推荐一些超级简单的方法,例如向您的 Dao 添加一个新方法

@Query("SELECT * FROM recipes LIMIT 1")
Recipe getAnyRecipe();

并执行此检查以查找 null 以查看食谱表中是否存在任何内容。

【讨论】:

根据观察者,我使用 MediatorLiveData 来观察 LiveData。 getAnyRecipe() 帮助我解决了我的问题。谢谢!

以上是关于使用 LiveData 时检查 RoomDatabase 是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

LiveData 防止在开始观察时收到最后一个值

Android LiveData使用

如何使用 LiveData 处理错误状态?

androidx.paging.DataSource.Factory 时 Room 不检索数据(使用 LiveData + Kotlin Coroutines)

当我在 LiveData 观察者中使用 navController 时,Android Navigation 组件图停止正常工作

Android---Jetpack之LiveData