首页 > 解决方案 > Android Room,如果没有匹配的行,Query 会返回什么?

问题描述

@Dao
interface  ExampleDao {
    @Query("SELECT * FROM example_table WEHRE id = :id")
    fun getExample(id: Int): LiveData<Example>
}

如果数据库中没有匹配的 id,上面的查询返回什么?我猜它不能为空,因为返回类型不可为空。

如果返回类型可以为空,查询是否返回 null?喜欢LiveData<Example>?LiveData<Example?>

标签: androidandroid-roomandroid-architecture-componentsandroid-jetpack

解决方案


我想你会得到一个liveData对象,但liveData.value给你null。

如果你有一个观察者,null无论它是LiveData<Example>LiveData<Example?>

有关更多详细信息,您可以查看yourDao_impl.javaRoom 为您生成的内容。

并注意:它不能保证是非空的

  @Override
  public LiveData<Experiment> queryLiveData(final String profileId) {
    final String _sql = "SELECT * FROM experiment WHERE profileId= ?";
    return __db.getInvalidationTracker().createLiveData(new String[]{"experiment"}, false, new Callable<Experiment>() {
      @Override
      public Experiment call() throws Exception {
          ...
          final Experiment _result;
          if(_cursor.moveToFirst()) {
            _result = new Experiment();
            final String _tmpProfileId;
            _tmpProfileId = _cursor.getString(_cursorIndexOfProfileId);
          } else {
            _result = null;
          }
          return _result;
        } finally {
          _cursor.close();
        }
      }

并且不要使用LiveData<Example>?它似乎没有帮助,但会给你潜在的 NPE。


推荐阅读