在Android房间迁移中获取上下文:

在我的迁移中,我想获取上下文以从assets资源 中读取一些文件:

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

    @Provides
    @Singleton
    fun provideAppDatabase(
        @ApplicationContext context: Context,
    ): AppDatabase = Room.databaseBuilder(context, AppDatabase::class.java, "app")
        .addMigrations(MIGRATION_3_4)
        .build()
}
val MIGRATION_3_4 = object : Migration(3, 4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        //...
        val txt = context.resources.assets.open("example.txt").bufferedReader().use { it.readText() }
    }
}

推荐答案

创建一个扩展Migration的类,该类将context作为constructor中的参数

class Migration3to4(@ApplicationContext val context: Context): Migration(3.4) {
 override fun migrate(database: SupportSQLiteDatabase) {
        // access context here
        val txt = context.resources.assets.open("example.txt").bufferedReader().use { it.readText() }
    }
}

调用站点

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

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

Android相关问答推荐

如何解决Android Studio中的in fragment问题

Android开发:主题排版不适用于按钮文本

添加可组合元素的列表?

房间@嵌入式VS一对一关系

在以XML格式设置完整屏幕视图时可见App Compat按钮

Modifer.Align()不适用于行/列/框中的文本.未解决的作用域实例错误

OverridePendingTransition已弃用,我该怎么办?

不能有意地从一个活动的可组合功能转移到另一个活动

Android Kotlin - 计费 - 从应用内购买获取productId

如何正确创建可拖动的浮动视图?

如何绘制内边框?

Android collectAsStateWithLifecycle() 不在可组合内部收集

如何解决 compose 中material 图标的由于接收器类型不匹配,以下候选者都不适用

观察软键盘可见性,打开/关闭 Jetpack Compose

将房间中的实体更新为 isCompleted 并使用 Flow 问题获取所有数据

如何对齐文本和图标可组合,以便即使在文本溢出后它们也能保持在一起?

如何在jetpack compose中创建水印文字效果

并行运行两个挂起函数并在第一个返回时返回

更新后 Firebase 服务无法在模拟器上运行

单击后退按钮时,应用程序会在一秒钟后崩溃