使用ItemKeyedDataSource观察Room Database表中的更改 [英] Observing changes in Room Database table using ItemKeyedDataSource

查看:103
本文介绍了使用ItemKeyedDataSource观察Room Database表中的更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经实现了扩展 ItemKeyedDataSource 的类> ,并提供来自会议室数据库的数据访问对象(DAO)的分页数据.我的DAO的查询方法将数据对象列表(未由 LiveData 包装)传递给 DataSource 回调.

I have implemented class which extends ItemKeyedDataSource and provides paging data from room database's data access object (DAO). My DAO's query methods pass lists of data objects (not wrapped by LiveData) to DataSource callbacks.

在包装的数据库表中发生更改后(例如,更改是否来自后台服务),建议使 DataSource 无效的方法是什么?DAO可以生成的 DataSource.Factory< Integer,T> 返回参数如何实现自动数据无效?

What is the recommended way to invalidate DataSource after changes occur in it's wrapped database table, for example if changes come from background Service? How automatic data invalidation is implemented in DataSource.Factory<Integer, T> return parameter that DAOs can generate?

推荐答案

自动 DataSource 失效可以通过将 InvalidationTracker.Observer 挂接到 InvalidationTracker 来实现.>.您可以从

Automatic DataSource invalidation can be implemented by hooking InvalidationTracker.Observer to InvalidationTracker. You can get InvalidationTracker instance from getInvalidationTracker().

我实现了这样的 InvalidationTracker.Observer :

public class DataSourceTableObserver extends InvalidationTracker.Observer {

    private DataSource dataSource;

    public DataSourceTableObserver(@NonNull String tableName) {
        super(tableName);
    }

    @Override
    public void onInvalidated(@NonNull Set<String> tables) {
       if (dataSource != null) dataSource.invalidate();
    }

    public void setCurrentDataSource(DataSource source) {
        dataSource = source;
    }

}

我正在像这样的内部 DataSource.Factory 类中使用它:

And I'm using it in my inner DataSource.Factory class like this:

public static class Factory implements DataSource.Factory<TvProgram, TvProgram> {

    private Context appContext;
    private DataSourceTableObserver observer;
    private InvalidationTracker tracker;
    private int channelId;

    public Factory(Context context, int channelId) {
        appContext = context.getApplicationContext();

        observer = new DataSourceTableObserver(AppDatabase.PROGRAMS_TABLE);
        tracker = AppDatabase.getInstance(appContext).getInvalidationTracker();
        tracker.addObserver(observer);

        this.channelId = channelId;
    }

    @Override
    public DataSource<TvProgram, TvProgram> create() {
        EpgDataSource epgDataSource = new EpgDataSource(appContext, channelId);
        observer.setCurrentDataSource(epgDataSource);
        return epgDataSource;
    }

    public void cleanUp() {
        tracker.removeObserver(observer);
        observer = null;
    }

}

DataSourceTableObserver 使 DataSource 无效时,它是 Factory 内部类创建具有最新数据的新 DataSource 实例.

When DataSourceTableObserver invalidates DataSource, it's Factory inner class creates new DataSource instance with newest data.

这篇关于使用ItemKeyedDataSource观察Room Database表中的更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆