Clean Architecture 和 Paging 3.0 with Room

Clean Architecture and Paging 3.0 with Room

我正在将分页更新到 3.0 版,因为我使用的是干净的架构(这里重要的是我拥有我的回购和我的 useCases 的核心与所有 android 框架所在的应用程序模块之间的分离classes ..) 但是我使用了两个模型 classes(一个用于从房间查询数据,例如:

 data class ExampleEntity(
    
        @Expose
        @ColumnInfo(name = INTERVENTION_ID_COLUMN_NAME)
        @SerializedName(INTERVENTION_ID_COLUMN_NAME)
        val interventionId: String?,
    
        @Expose
        @ColumnInfo(name = SITE_NAME_COLUMN_NAME)
        @SerializedName(SITE_NAME_COLUMN_NAME)
        val siteName: String?
    }

另一个将在核心模块和用例中使用,完全不暗示房间数据库是依赖项...例如:

data class Example(

        @Expose
        @SerializedName(INTERVENTION_ID_COLUMN_NAME)
        val interventionId: String?,

        @Expose
        @SerializedName(SITE_NAME_COLUMN_NAME)
        val siteName: String?
    }

稍后在 databseImplementation 中,我将实体 class 映射到核心 Class 并且可以在分页 2 中映射分页列表,现在我似乎无法访问 PagingData object 的实体,只能添加到它(headers,分隔符...等)我如何克服这个设计难题?

正如您从以下内容中看到的那样 documentation,可以在 PagingData 中的项目到达您的 ViewModel 之前对其进行转换。

在您的存储库中,您应该有与此类似的内容

val flow = Pager(PagingConfig(pageSize = 20)) {
  ExamplePagingSource(backend, query)
}.flow

想法是像这样映射 flow 的内容

flow.mapLatest { pagingData ->
        pagingData.map { entity -> 
            // map to from ExampleEntity to Entity here
        }
    }