Android Jetpack ROOM 的Dao返回LiveData<Bean>封装及Bean普通的区别

Posted 怪兽N

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Jetpack ROOM 的Dao返回LiveData<Bean>封装及Bean普通的区别相关的知识,希望对你有一定的参考价值。

android Jetpack ROOM 的Dao返回LiveData<Bean>及Bean的区别, LiveData封装与普通没有封装的区别

简介

使用Android Jetpack ROOM时,我们会定义Dao的查询返回,LiveData<Bean> 是配合MVVP开发模式返回,普通的直接查询返回Bean或者Beans适合普通查询返回。LiveData是带有生命周期的封装,在ViewModel、AndroidViewModel、ViewBinding中可以在LifeCycleOwner的生命周期内,实现数据库信息更新的监听,实现数据的双向变化绑定。

定义1 LiveData

@Dao
public interface UserDao {
     @Query("SELECT * FROM user_tb")
    List<List<User>> getAll();
}

定义2

@Dao
public interface UserDao {
     @Query("SELECT * FROM user_tb")
    LiveData<List<User>> getAll();
}

Room框架生成代码

在build的目录下
在这里插入图片描述

LiveData形式生成代码

 @Override
  public LiveData<List<User>> getAll() {
    final String _sql = "SELECT * FROM user_tb";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
    return __db.getInvalidationTracker().createLiveData(new String[]{"user_tb"}, false, new Callable<List<User>>() {
      @Override
      public List<User> call() throws Exception {
        final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
        try {
			.....
          }
          return _result;
        } finally {
          _cursor.close();
        }
      }

      @Override
      protected void finalize() {
        _statement.release();
      }
    });
  }

对于LiveData形式的生成代码,最基本我们看到了,查询封装在Callable中了,也就是很可能是任务式调用的。实际上,在被观测的时候才会调用。

返回直接数据形式

 @Override
  public List<User> getAll() {
    final String _sql = "SELECT * FROM user_tb";
    final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
    __db.assertNotSuspendingTransaction();
    final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
    try {
		...
        _result.add(_item);
      }
      return _result;
    } finally {
      _cursor.close();
      _statement.release();
    }
  }

对于直接返回Beans的形式,生成代码中,我们看到这种接口是直接调用查询的,跟使用原生的SQLiteHelper差不多,只是Room框架帮我们生成了。

使用区别重点

LiveData封装数据返回的使用

如果这样写,我们获取的数据是LiveData中旧的数据,千万要注意:

LiveData<List<User>> all = userDao.getAll();
if(all !=null){
    List<User> value = all.getValue();
    //value不是最新数据,可能不是我们想要的
    ...
}

所以,要使用LiveData形式的数据时,要通过观测者获取数据,否是获取的可能不是最新的数据,因为Callable里的查询根本还没执行。那么我们可以要通过Observer观测数据,当数据发生变化时就可以获取到最新数据。

LiveData正确查询

LiveData<List<User>> all = userDao.getAll();
if(all!=null){
    all.observe(getLifeCycleOwner, new Observer<List<User>>() {
        @Override
        public void onChanged(List<User> value) {
            //OK 最新数据
            ...
        }
    });
}

直接数据返回的使用

这种使用认为是直接查询即可

List<User> all = userDao.getAll();
if(all !=null && !all.isEmpty()){
    //OK 最新数据
    ...
}

总结

最重要的点在于知道LiveData要通过Oberser观测获取数据。

以上是关于Android Jetpack ROOM 的Dao返回LiveData<Bean>封装及Bean普通的区别的主要内容,如果未能解决你的问题,请参考以下文章

Android jetpack room SQLLite 数据库 修改字段

Android Jetpack: Room | 中文教学视频

Android Jetpack Paging 3:带 Room 的 PagingSource

Android jetpack room 记录数据库升级日志

Android jetpack room+ViewModel+liveData 数据自动更新

Android jetpack room 数据库的升级异常处理