首页 > 解决方案 > 如果项目存在于数据库中,为什么 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

数据库图像。显然电影 id 419704 存在(第二项): 在此处输入图像描述

标签: androidsqliteandroid-room

解决方案


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

但是,您立即尝试从LiveData. 这在大多数情况下是行不通的,因为后台线程还没有完成它的工作。

任何一个:

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

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


推荐阅读