使用 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 是不是为空的主要内容,如果未能解决你的问题,请参考以下文章
androidx.paging.DataSource.Factory 时 Room 不检索数据(使用 LiveData + Kotlin Coroutines)
当我在 LiveData 观察者中使用 navController 时,Android Navigation 组件图停止正常工作