【问题标题】:How to query a Room database so it returns a single object?如何查询 Room 数据库使其返回单个对象?
【发布时间】:2019-01-31 19:47:25
【问题描述】:

我使用 Room 作为我项目的本地数据库。我创建了一个MovieDao 接口:

@Dao
public interface MovieDao {
    @Query("SELECT * FROM movies ORDER BY title ASC")
    LiveData<List<Movies.Movie>> getMovies();

    @Query("SELECT * FROM movies WHERE id = :id")
    LiveData<Movies.Movie> getMovie(int id);
}

每次我尝试调用 getMovies() 方法时,它都会正确返回 Movie 对象的列表,但如果我调用 getMovie(int id) 并传递数据库中肯定存在的 id,我总是会得到 NPE。

我可以创建一个查询而不是返回单个 Movie 对象吗?

谢谢!

编辑:

LiveData<Movies.Movie> liveData = movieRepository.retrieveFavoriteMovieTask(550);
liveData.observe(this, m -> {
    Log.d(TAG, m.title);
});

错误:

java.lang.NullPointerException:尝试从空对象引用上的字段“java.lang.String com.example.myapp.Movies$Movie.title”读取

【问题讨论】:

  • 该查询看起来不错。你能添加堆栈跟踪吗?
  • @MartinZeitler 当然,马上。
  • @MartinZeitler 请立即查看。
  • @MartinZeitler 有什么想法吗?
  • m 未在范围内定义;那可能应该是movie.title

标签: android android-sqlite android-room android-livedata


【解决方案1】:

id 可以按房间预订。您可以使用 @PrimaryKey(autoGenerate = true) 设置一个自动递增的 PK,然后定义您自己的 id (movie_id),您可以随意设置和获取它,同时保持 PK 完整性。

【讨论】:

  • 感谢您的回答。好的,我明白了,格式相同,但我如何查询才能只获取一个对象? id 等于特定 id 的那个。
  • SELECT movie_title From movies where.... 其中 movie_title 是您想要返回的任何字段。选择 * 给你整行
  • 好的,然后将movie_title 作为字符串或整个电影对象返回给我?
  • 应该是字符串或实体类中设置的任何字段。
  • 好的,但我不想只查询 movie_title,我想获取具有特定 ID 的整个 Movie 对象。你觉得可以吗?
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
相关资源
最近更新 更多