我使用Paging 3,本地数据库使用Room,@Query from Room如下:
@Query("SELECT * FROM Channel LIMIT :limit OFFSET :offset")
suspend fun getAllChannels(limit: Int, offset: Int): List<Channel>
然后我像这样在PagingSource中获取我的数据,并返回带有我的数据的LoadResult.Page
channels = channelDao.getAllChannels(
params.loadSize,
position * params.loadSize
)
return LoadResult.Page(
data = channels,
prevKey = if (position == INITIAL_INDEX) null else position - 1,
nextKey = if (mData.isEmpty()) null else position + 1
)
在我的存储库中,我得到这样的通道:
override fun getAllChannels(): Flow<PagingData<Channel>> {
return Pager(
PagingConfig(
pageSize = 20,
enablePlaceholders = false,
initialLoadSize = 20
)
) {
ChannelPagingSource(
channelDao
)
}.flow
}
这种方法的问题是,我的视图无法观察到通道对象上发生的任何修改,因此如果它被更新,就无法得到通知。使用分页可以获得可观察的对象吗?
一种替代方式是放弃寻呼并且仅返回Flow<列表>从Room下载并消费它,但它很重,会使应用程序的速度减慢一点。
- 在gradle模块中添加
room-paging
依赖项。使用该Room可以处理查询中的PagingSource
对象
implementation "androidx.room:room-paging:2.5.0"
- 创建一个在
@Dao interface
中返回PagingSource<Int, EntityDb>
的方法。Int
-页码/偏移量,EntityDb
-您的数据库模型,在您的情况下为Channel
@Query("SELECT * FROM Channel")
fun pagingSource(): PagingSource<Int, Channel>
- 从存储库中获取
PagingData
流
fun observePagingSource(): Flow<PagingData<Channel>> {
return Pager(
config = PagingConfig(pageSize = 20, initialLoadSize = 20),
pagingSourceFactory = { channelDao.pagingSource() }
).flow
}
一件重要的事情-使用您的刀的单个实例
如果您在一个Dao实例中插入/更新/删除数据,并在另一个实例中观察到它的变化,则不会收到更新。