android - 如果项目存在于数据库中,为什么 Room 查询返回 null?
问题描述
我已将电影插入到我的数据库中,并希望根据 movieId 查询数据库。我可以使用 Stetho 检查器确认 movieId 在我的数据库中。为什么我会为空?
道
@Dao
public interface MoviesDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insertMovie(Movie movie);
@Transaction
@Query("SELECT * FROM movie WHERE id = :movieId ")
LiveData<Movie> getMovie(long movieId);
视图模型
public void getMovieFromDatabase(Movie movie) {
LiveData<Movie> result = movieRepository.getMovieFromDatabase(movie);
Log.d(TAG, "result is: " + result.getValue());
}
存储库
public LiveData<Movie> getMovieFromDatabase(Movie movie) {
Log.d(TAG, "Movie id: " + movie.getId());
return dbInstance.moviesDao().getMovie(movie.getId());
}
来自 Logcat 的结果
Movie id: 419704
result is: null
解决方案
getMovie()
是你的 DAO 方法。它返回一个LiveData
. 这将导致 Room 在后台线程上执行数据库 I/O。
但是,您立即尝试从LiveData
. 这在大多数情况下是行不通的,因为后台线程还没有完成它的工作。
任何一个:
摆脱
LiveData
并getMovie()
直接返回结果,并getMovie()
在后台线程上调用,或者observe()
,LiveData
而不是立即尝试使用它的值
推荐阅读
- javascript - 如何使用 for 循环创建多个进度条?
- reporting-services - SSRS 呈现为 pdf 始终将日期显示为 MM/DD/YYYY
- python - 文件名中带有空格的python中的单词计数
- google-bigquery - BigQuery:它是否支持 UDAF?
- vba - 将预定义的 excel 函数应用于 VBA for 循环数组以创建新函数
- javascript - 解析错误Javascript
- android - Glide 4.7.1 占位符未加载
- ide - 如何将 SQL 开发人员/Toad 连接到 Oracle 8i
- handlebars.js - 如果标题文本的条件如何编写车把
- javascript - Angular - 在组件中显示服务器错误