使用 LiveData 检查 RoomDatabase 是否为空
Checking if RoomDatabase is empty while using LiveData
我正在尝试在我的 Android 应用程序中使用 RoomDatabase
。我正在使用 LiveData
来自动刷新片段中的更改。
我第一次 运行 安装我的应用程序时,我从 API 获取数据,创建我的 RoomDatabase
并存储我的数据。
第二次我 运行 我的应用程序我想检查我的数据库是否不为空。但是在使用 LiveData
时:以下代码返回 null。
AppDatabase.getInstance(getContext()).getRecipeDao().getAllRecipes().getValue();
我读过"if the response is an observable data type, such as Flowable or LiveData, Room watches all tables referenced in the query for invalidation"。
如何检查我的 RoomDatabase 是否有数据或为空?
所以在自己实施之后,我发现你需要做一些事情:
- 确保您有
Observer
用于更改 LiveData
- 除非您使用
LiveCyclerOwner
,否则您需要调用 observeForever(Observer<T> observer)
,然后使用它代替:observe (LifecycleOwner owner, Observer<T> observer)
- 最后,
getValue()
上有一个有趣的注释:
Returns the current value. Note that calling this method on a
background thread does not guarantee that the latest value set will be
received
所以重申一下,我认为你的方法行不通。
您需要创建某种类型的单独检查,而不是使用 returns a LiveData
class 的方法,因为它不能保证收到最新的值集通过调用 getValue()
.
最后我会推荐一些超级简单的东西,比如给你的 Dao
添加一个新方法
@Query("SELECT * FROM recipes LIMIT 1")
Recipe getAnyRecipe();
并执行此检查以查找 null
以查看食谱 table.
中是否存在任何内容
我正在尝试在我的 Android 应用程序中使用 RoomDatabase
。我正在使用 LiveData
来自动刷新片段中的更改。
我第一次 运行 安装我的应用程序时,我从 API 获取数据,创建我的 RoomDatabase
并存储我的数据。
第二次我 运行 我的应用程序我想检查我的数据库是否不为空。但是在使用 LiveData
时:以下代码返回 null。
AppDatabase.getInstance(getContext()).getRecipeDao().getAllRecipes().getValue();
我读过"if the response is an observable data type, such as Flowable or LiveData, Room watches all tables referenced in the query for invalidation"。
如何检查我的 RoomDatabase 是否有数据或为空?
所以在自己实施之后,我发现你需要做一些事情:
- 确保您有
Observer
用于更改LiveData
- 除非您使用
LiveCyclerOwner
,否则您需要调用observeForever(Observer<T> observer)
,然后使用它代替:observe (LifecycleOwner owner, Observer<T> observer)
- 最后,
getValue()
上有一个有趣的注释:
Returns the current value. Note that calling this method on a background thread does not guarantee that the latest value set will be received
所以重申一下,我认为你的方法行不通。
您需要创建某种类型的单独检查,而不是使用 returns a LiveData
class 的方法,因为它不能保证收到最新的值集通过调用 getValue()
.
最后我会推荐一些超级简单的东西,比如给你的 Dao
@Query("SELECT * FROM recipes LIMIT 1")
Recipe getAnyRecipe();
并执行此检查以查找 null
以查看食谱 table.