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

如何在Android Room Migration中获取Context以读取Assets文件?

解决Room Migration中获取Context读取Assets文件的问题

核心思路

把Migration从匿名对象改为可接收Context的类,通过构造方法注入全局ApplicationContext,让migrate方法能直接访问资源。

步骤1:重构Migration类

将原来的匿名Migration对象改成带Context参数的类:

class Migration3To4(private val context: Context) : Migration(3, 4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        // 读取Assets目录下的文件
        val txt = context.resources.assets.open("example.txt").bufferedReader().use { it.readText() }
        
        // 执行其他数据库迁移操作...
    }
}

步骤2:在Hilt模块中初始化Migration并传入Context

修改PersistenceModule,移除不必要的Application继承(Hilt模块无需继承该类),创建Migration实例时传入ApplicationContext:

@Module
@InstallIn(SingletonComponent::class)
object PersistenceModule {

    @Provides
    @Singleton
    fun provideAppDatabase(
        @ApplicationContext context: Context,
    ): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, "app")
        .addMigrations(Migration3To4(context))
        .build()
}

注意事项

  • 必须使用@ApplicationContext注入全局上下文,不要传入Activity等具有生命周期的Context,避免内存泄漏。
  • Migration持有ApplicationContext是安全的,因为ApplicationContext生命周期和应用一致,不会引发内存泄漏问题。

内容的提问来源于stack exchange,提问作者Lemkinator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:13:10