如果数据库中存在该项,为什么Room查询返回null?

时间:2020-06-07 17:59:25

标签: android sqlite android-room

我已将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

数据库的图像。显然电影ID 419704存在(第二项): enter image description here

1 个答案:

答案 0 :(得分:3)

getMovie()是您的DAO方法。它返回一个LiveData。这将导致Room在后台线程上执行数据库I / O。

但是,您立即尝试从LiveData中获取值。大多数情况下,这将无法正常工作,因为后台线程尚未完成其工作。

要么:

  • 摆脱LiveData并让getMovie()直接返回结果,并在后台线程上调用getMovie(),或者

  • observe() LiveData,而不是立即尝试使用其值