Room数据库迁移测试:导出旧版JSON Schema及解决文件缺失问题
Room Schema导出与迁移测试文件缺失问题解决
一、正确配置Schema导出
1. 适配注解处理器调整RoomSchemaArgProvider
根据你使用的注解工具(KAPT/KSP)修改代码:
- 用KAPT时保留原实现:
class RoomSchemaArgProvider( @get:InputDirectory @get:PathSensitive(PathSensitivity.RELATIVE) val schemaDir: File ) : CommandLineArgumentProvider { override fun asArguments(): Iterable<String> { return listOf("-Aroom.schemaLocation=${schemaDir.path}") } }
- 用KSP时修改返回参数格式:
class RoomSchemaArgProvider( @get:InputDirectory @get:PathSensitive(PathSensitivity.RELATIVE) val schemaDir: File ) : CommandLineArgumentProvider { override fun asArguments(): Iterable<String> { return listOf("room.schemaLocation=${schemaDir.path}") } }
2. 关联Gradle编译任务
在模块的build.gradle.kts(或build.gradle)中添加配置,指定Schema输出目录并绑定到编译流程:
// 定义Schema输出目录,建议放在模块根目录的schemas文件夹 val schemasDir = file("schemas") android { defaultConfig { // KAPT配置方式 javaCompileOptions { annotationProcessorOptions { compilerArgumentProviders.add(RoomSchemaArgProvider(schemasDir)) } } // KSP配置方式(二选一) ksp { arg(RoomSchemaArgProvider(schemasDir)) } } // 自动将Schema目录关联到测试模块的assets,避免手动复制 sourceSets { androidTest.assets.srcDir(schemasDir) } }
二、解决FileNotFoundException异常
1. 确认Schema已生成
执行编译任务(./gradlew compileDebugSources或Android Studio中Build > Make Project),检查schemas目录下是否生成了com.sboxnw.freeplay.data.database.SugarBoxDatabase文件夹,且包含对应版本的JSON文件(比如2.json)。若未生成:
- 检查Room依赖版本一致性(room-runtime、room-compiler版本必须完全匹配)
- 确认数据库类的
@Database注解中exportSchema = true(默认开启,若手动设为false会停止生成Schema)
2. 确保测试模块能访问Schema文件
如果Schema已生成但测试时找不到:
- 检查
androidTest/assets目录下是否存在com.sboxnw.freeplay.data.database.SugarBoxDatabase文件夹及对应版本JSON文件,若没有可手动复制schemas目录下的对应内容,或通过上述Gradle的sourceSets配置自动同步 - 核对迁移测试代码中指定的数据库版本号与Schema文件名一致(比如测试从v1迁移到v2,需确保
1.json和2.json都存在) - 检查路径大小写:Android对assets路径大小写敏感,确保包名、文件名与代码中的完全匹配
3. 通用排查步骤
- 多模块架构下,确认测试模块依赖了生成Schema的业务模块
- 执行
./gradlew clean build清理缓存后重新构建,避免缓存导致的文件缺失
内容的提问来源于stack exchange,提问作者nikita soloman
相关产品推荐
相关产品推荐

