【问题标题】:Compose list with section headers using group by query with paging使用分组查询和分页来编写带有节标题的列表
【发布时间】:2022-08-03 00:30:19
【问题描述】:

给定一个有很多行的表,如果可能,我想使用分页进行查询。分页时,我还想根据数据库列对数据进行分组,并将该列用作每个组的节标题。

数据表:

Id, section, data1, data2
0, \"One\", 1, 2
1, \"One\", 2, 3
2, \"Two\", 40, 20
3, \"Two\", 11, 21
4, \"Three\", 110, 23

房间查询:

@Query(\"SELECT section, * FROM data GROUP BY section ORDER BY section ASC\")
fun getData(): PagingSource<Int, DataGroup>

data class DataGroup(
   @ColumnInfo(name = \"section\") val section: String,
   @Embedded val data: Data
)

然后在撰写中:

@Composable
private fun Data(
  viewModel: DataViewModel = hiltViewModel()
) {
viewModel.lights,
  val lazyItems: LazyPagingItems<DataGroup> = viewModel.data.collectAsLazyPagingItems()

  LazyColumn() {
    items(lazyItems) { item: DataGroup ->
       // I can iterate each item by this is not grouped
    }
  }
}

编辑:再想一想,我不认为 SQL \"group by\" 是我所追求的。可能更像是:

@Query(\"SELECT section, * FROM data ORDER BY section ASC\")
fun getData(): List<Data>

和:

val groupedData = dao.getData.groupBy { it.section }

但是,那时我失去了分页的优势。可以通过分页实现按部分结果分组吗?

  • 如果您使用的是compose,我认为最好自己实现分页列表而不是使用分页3。 paging3 有很多限制,试图绕过它们是很痛苦的。这是我实现的paged list,它可能会有所帮助。

标签: android-room android-jetpack-compose


【解决方案1】:

似乎分页库已经有一个实用程序来处理这个问题。就我而言:

@Query("SELECT section, * FROM data ORDER BY section ASC")
fun getData(): PagingSource<Int, Data>

然后映射数据,并使用 insertSeparators 确定节标题的放置位置:

val data: Flow<PagingData<Data>> = Pager(PagingConfig(pageSize = 20), null) {
   repository.getData()
}.flow
   .map { pagingData ->
      mapped.insertSeparators { data1: Data?, data2: Data? ->
         if (data1?.section != data2?.section) {
           Data(section = data2?.section, isHeader = true)
         } else null
      }
}

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2018-11-08
    • 2020-09-06
    相关资源
    最近更新 更多