Android Jetpack-LiveData与Room一起使用

855 阅读2分钟

这是我参与 8 月更文挑战的第 17 天,活动详情查看: 8月更文挑战

背景

在项目中不可避免的使用数据库, 而三方框架又是五花八门, 在这中我就选择了Google Jetpack组件中的Room.
上一篇简单介绍了一下LiveData的使用, 就会在想, LiveData可不可以和Room一起使用呢? 当然是可以的.

介绍

Google官方文档中写道: Room持久性库支持返回 LiveData 对象的可观察查询。可观察查询属于数据库访问对象 (DAO) 的一部分。

当数据库更新时,Room 会生成更新 LiveData 对象所需的所有代码。在需要时,生成的代码会在后台线程上异步运行查询。此模式有助于使界面中显示的数据与存储在数据库中的数据保持同步。

使用

1.在Dao中把返回值再包裹一层LiveData

@Query("SELECT * FROM Test  WHERE account =:account ")
LiveData<List<Object>> getDataLive(String account);

2.在Repo中实现对应的方法

public LiveData<List<Object>> getDataLive(String account) {
    return mDatabase.testDao().getDataLive(account);
}

3.在Ui中对此方法进行观察

TestRepo.getInstance().getDataLive("")
        .observe(this, new Observer<List<Object>>() {
            @Override
            public void onChanged(List<Object> objects) {
                //根据返回数据实现对应的逻辑
            }
        });

这种实现可以保证你所要的数据永远保持最新, 因只要数据库中对应的值更新, LiveData对象就会把最新的值更新过来, 如果只需要一次查询, 可以配合ViewModel一起使用

通过ViewModel实现一次查询

1.在Dao中定义方法

@Query("SELECT * FROM Test  WHERE account =:account ")
List<Object> getData(String account);

2.在Repo中实现

public List<Object>  getData(String account) {
    return mDatabase.testDao().getData(account);
}

3.在ViewModel中创建LiveData对象

public class TestViewModel extends ViewModel {
    private MutableLiveData<List<Object>> data;
    public TestViewModel(){
        data = new MutableLiveData<>();
    }
    
    public LiveData<List<Object>> initDataLive(){
        return data;
    }

}

4.在Ui中观察LiveData对象

viewModel.initDataLive().observe(this, new Observer<List<Object>>() {
    @Override
    public void onChanged(List<Object> objects) {
        //更新UI或者实现对应的逻辑
    }
});

5.在ViewModel实现调用数据库方法

public void getData(String account){
    ((Runnable) () -> data.postValue(TestRepo.getInstance().getData(account))).run();
}

6.在需要的地方进行调用