gpt4 book ai didi

Android Jetpack 分页 3 : PagingSource with Room

转载 作者:行者123 更新时间:2023-12-04 11:15:53 26 4
gpt4 key购买 nike

我正在使用最新的 Jetpack 库。
分页3版本:3.0.0-alpha05房间版:2.3.0-alpha02我的实体有 Long as PrimaryKey和 Room 可以生成 PagingSource对于 Int 以外的其他人类型。

error: For now, Room only supports PagingSource with Key of type Int.
public abstract androidx.paging.PagingSource<java.lang.Long, com.example.myEntity>` getPagingSource();
因此我尝试实现我的自定义 PagingSource ,如 docs建议。
问题是 数据刷新 ,因为 Room 生成的代码处理数据刷新,而我的代码无法处理这种情况。
关于如何实现自定义 PagingSource 的任何建议对于 Room也处理 Data Refresh ?

最佳答案

由于您有“刷新”场景并使用 Room db,我猜您正在使用 Paging3 和 network+local db 模式(使用 Room db 作为本地缓存)。
我在网络 + 本地数据库模式中遇到了类似的情况。我不确定我是否正确理解了您的问题,或者您的情况与我的情况相同,但无论如何我都会分享我所做的。
我用的是什么:

  • 分页3:3.0.0-beta01
  • 房间:2.3.0-beta02

  • 我所做的是让 Room 库创建 PagingSource(使用 Int 的键),并让 RemoteMediator处理所有其他情况,例如刷新和/或追加时从网络获取数据,并在获取成功后立即将它们插入数据库。
    我的 dao从 Room Library 创建 PagingSource 的函数:
    @Query("SELECT * FROM article WHERE isUnread = 1")
    fun getUnreadPagingSource(): PagingSource<Int, LocalArticle>
    在我的例子中,我将 Repository 类定义为具有 dao创建 Pager 时在其构造函数中调用上述函数类(class)。
    我的自定义 RemoteMediator 类如下所示:
  • 注意:就我而言,没有 PREPEND 案例,所以 RemoteMediator#load函数总是返回 true当参数值loadTypeLoadType.PREPEND .

  • class FeedMediator(
    private val repository: FeedRepository
    ) : RemoteMediator<Int, LocalArticle>() {

    ...

    override suspend fun load(
    loadType: LoadType,
    state: PagingState<Int, LocalArticle>
    ): MediatorResult = runCatching {
    when (loadType) {
    LoadType.PREPEND -> true
    LoadType.REFRESH -> {
    feedRepository.refresh()
    false
    }
    LoadType.APPEND -> {
    val continuation = feedRepository.continuation()
    if (continuation.isNullOrEmpty()) {
    true
    } else {
    loadFeedAndCheckContinuation(continuation)
    }
    }
    }
    }.fold(
    onSuccess = { endOfPaginationReached -> MediatorResult.Success(endOfPaginationReached) },
    onFailure = {
    Timber.e(it)
    MediatorResult.Error(it)
    }
    )

    private suspend fun loadFeedAndCheckContinuation(continuation: String?): Boolean {
    val feed = feedRepository.load(continuation)
    feedRepository.insert(feed)
    return feed.continuation.isNullOrEmpty()
    }
    最后你可以创建 Pager类(class)。
    fun createFeedPager(
    mediator: FeedMediator<Int, LocalArticle>,
    repository: FeedRepository
    ) = Pager(
    config = PagingConfig(
    pageSize = FETCH_FEED_COUNT,
    enablePlaceholders = false,
    prefetchDistance = PREFETCH_DISTANCE
    ),
    remoteMediator = mediator,
    pagingSourceFactory = { repository.getUnreadPagingSource() }
    )
    我希望它在某种程度上有所帮助..
    其他引用:
  • https://developer.android.com/topic/libraries/architecture/paging/v3-network-db
  • https://android-developers.googleblog.com/2020/07/getting-on-same-page-with-paging-3.html
  • https://www.youtube.com/watch?v=1cwqGOku2a4

  • 编辑:
    再次阅读文档后,我发现了 the doc 的声明明确指出:

    RemoteMediator to use for loading the data from the network into the local database.

    关于Android Jetpack 分页 3 : PagingSource with Room,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63556462/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com