我已将Movie插入我的数据库,并想基于movieId查询数据库。我可以使用Stetho检查器确认movieId在我的数据库中。为什么我会变成空?
DAO
@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);
ViewModel
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
答案 0 :(得分:3)
getMovie()
是您的DAO方法。它返回一个LiveData
。这将导致Room在后台线程上执行数据库I / O。
但是,您立即尝试从LiveData
中获取值。大多数情况下,这将无法正常工作,因为后台线程尚未完成其工作。
要么:
摆脱LiveData
并让getMovie()
直接返回结果,并在后台线程上调用getMovie()
,或者
observe()
LiveData
,而不是立即尝试使用其值