使用ItemKeyedDataSource观察Room Database表中的更改 [英] Observing changes in Room Database table using ItemKeyedDataSource
问题描述
我已经实现了扩展 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屋!