Skip to content Skip to sidebar Skip to footer

Observing Changes In Room Database Table Using Itemkeyeddatasource

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

Solution 1:

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

I implemented my InvalidationTracker.Observer like this:

publicclassDataSourceTableObserverextendsInvalidationTracker.Observer {

    privateDataSource dataSource;

    publicDataSourceTableObserver(@NonNullString tableName) {
        super(tableName);
    }

    @OverridepublicvoidonInvalidated(@NonNullSet<String> tables) {
       if (dataSource != null) dataSource.invalidate();
    }

    publicvoidsetCurrentDataSource(DataSource source) {
        dataSource = source;
    }

}

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

publicstaticclassFactoryimplementsDataSource.Factory<TvProgram, TvProgram> {

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

    publicFactory(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;
    }

    publicvoidcleanUp() {
        tracker.removeObserver(observer);
        observer = null;
    }

}

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

Post a Comment for "Observing Changes In Room Database Table Using Itemkeyeddatasource"