You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:55:38