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观测获取数据。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值