如何在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
相关产品推荐
相关产品推荐

