该技能面向“把大体积 JSON 文件导入本地数据库”的场景,重点是导入过程要分批进行,并且让调用方能看到进度。整体被组织为一条 cold flow,发出一个较小的 sealed 进度类型,调用方负责收集;数据层不需要对外暴露工作是如何切分的。示例中的进度类型包含 Preparing、Importing(processed, total)、Success 和 Error 几种状态,整个流程通过 flowOn(Dispatchers.IO) 切到 IO 线程。
主要能力方面,导入被划分为四个阶段:解析、基本校验、按块写入歌曲、写入播放列表。前两个阶段通过之前不接触数据库。写库时按固定批大小分块,每完成一块就把已处理数量和总数做成一次进度事件,而不是每写一行都发一次,因为逐行发事件会给由 StateFlow 支撑的 UI 带来大量会被合并掉的更新,收集开销甚至可能超过插入本身。
文档还集中列出了若干容易出错的点:能解析但内容为空的文件应被视为错误文件,否则“导入 0 首”会被误认为成功;逐行插入慢的根源是逐次提交而不是行数本身,因此需要分块并配合事务;子记录引用不存在的父记录会导致外键失败,并可能连累整批,因此应先用 associateBy 一次性建立查找表再过滤;过滤后要重新编号,避免位置出现空洞;被跳过的条目数量要统计并回报,以便发现生产方的问题;写阶段要用 runCatching 把失败转为一次 Error 事件,而不是让异常逃逸;错误提示文案由调用方传入,以保持数据模块不依赖 UI 模块。
使用方式上,该技能要求实现方在仓库的 ImportRepositoryImpl.kt 中落实这些约束,并用文档给出的 grep 命令进行核验:确认只有一个 SONG_BATCH_SIZE 常量,且由同一个 chunked 调用消费并驱动进度事件;确认 associateBy 只出现一次且不在按播放列表的循环内;确认 MusicVideoType.normalize(videoType) 与 artistId?.takeIf 两处边界守卫按原样存在。此外还建议用手工方式在文档声明的最大文件规模上实测导入耗时,观察进度是否平滑,如果出现停顿后直接跳到 100%,说明批大小过大。
适用场景是需要在 Kotlin 应用中导入大规模结构化 JSON、并且要求有可感知进度反馈的本地数据写入流程。限制方面,该技能依赖具体仓库路径与源码结构,示例代码与常量仅适用于对应项目;安装命令、收费与支持平台等信息暂未提供。