android - Dagger 2 获得自己的 Room 实例

标签 android kotlin android-room dagger-2

我想向房间数据库添加回调以填充初始数据。

@Provides
@Singleton
fun provideRoom(context: Context): MyRoomDatabase {
    return Room.databaseBuilder(context, MyRoomDatabase::class.java, "my_database")
        .fallbackToDestructiveMigration()
        .addCallback(object : RoomDatabase.Callback() {
            @Override
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)

            }
        })
        .build()
}

为此,我需要回调中的数据库实例来访问 DAO 以插入数据。
这是如何运作的?

编辑:

我要达到的目标:Create initial data for the room database at the app installation
我的 Callback Class :
class RoomCallback(
 var myRoomDatabase : MyRoomDatabase
)  : RoomDatabase.Callback()  {
override fun onCreate(db: SupportSQLiteDatabase) {
    myRoomDatabase.basicItemDao().insertList(
        listOf(
            BasicItem(),
            BasicItem()
        )
    )
}

}

我如何提供 RoomDatabaseRoomCallback :
@Provides
@Singleton
fun provideRoom(context: Context, roomCallback: RoomCallback): MyRoomDatabase {
    return Room.databaseBuilder(context, MyRoomDatabase::class.java, "my_database")
        .fallbackToDestructiveMigration()
        .addCallback(roomCallback)    
        .build()
}

@Provides
@Singleton
fun provideRoomCallback(myRoomDatabase: MyRoomDatabase): RoomCallback {
    return RoomCallback(myRoomDatabase)
}

问题:
- RoomCallbackRoomDatabase实例需要另一个实例。

最佳答案

更新 : 使用 Kotlin CoroutineDagger2在聚会的后期,但对于 future 的读者来说,在创建时或打开时预填充您的数据库非常容易。确保您已经在 gradle 中添加了依赖项Coroutine 的文件.首先创建您的数据库,如:

    /**
     * Main database.
     */
    @Database(
        entities = [
            Login::class],
        version = 1,
        exportSchema = false
    )
    abstract class AppDatabase : RoomDatabase() {
        abstract fun loginDao(): LoginDao

        companion object {
            
            @Volatile private var INSTANCE: AppDatabase? = null

            fun getInstance(app: Application): AppDatabase = INSTANCE ?: synchronized(this) {
            INSTANCE ?: buildDatabase(app).also { INSTANCE = it }
        }

        private fun buildDatabase(app: Application) =
            Room.databaseBuilder(app,
                AppDatabase::class.java,
                "your database name")
            .addCallback(object : Callback() {
                // Pre-populate the database after onCreate has been called. If you want to prepopulate at opening time then override onOpen function instead of onCreate.
                override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)
                    // Do database operations through coroutine or any background thread
                    val handler = CoroutineExceptionHandler { _, exception ->
                        println("Caught during database creation --> $exception")
                    }

                    CoroutineScope(Dispatchers.IO).launch(handler) {
                        prePopulateAppDatabase(getInstance(app).loginDao())
                    }
                }
            })
            .build()

        suspend fun prePopulateAppDatabase(loginDao: LoginDao) {
            val admin = Login(0, "Administrator", "1234", 1, isActive = true, isAdmin = true, isLogged = false)
            loginDao.insertLoginData(admin)
        }
    }
}
然后,您可以通过将以下代码放入您的 Dagger AppModule 来提供单例实例或根据需要在单独的数据库模块中。
@Singleton
@Provides
fun provideDb(app: Application): AppDatabase {
    return AppDatabase.getInstance(app)
}

@Singleton
@Provides
fun provideLoginDao(db: AppDatabase): LoginDao {
    return db.loginDao()
}
就是这样,你完成了。在任何地方注入(inject)您的单例数据库对象,例如:
@Inject lateinit var loginDao: LoginDao
然后使用它。

关于android - Dagger 2 获得自己的 Room 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57968242/

相关文章:

kotlin - 在Kotlin运行时中更改字段名称

android - 在 gradle android library kotlin 项目中禁用 META-INF/* 生成

javax.smartcardio.* 在 Open JDK 11(Redhat) 上找不到

android - 架构组件: Observer keep observing even after removing it on onDestroy

Android 房间 DAO 接口(interface)不适用于继承

android - 像 Android Market 一样下载文件

java - 如何从 firebase 获取 json 列的名称?我在问题下面留下了一个例子

android - 更改背景后手指绘画变慢

android - 未找到参数 #1 的改造注释

android.arch.persistence.room :testing depends on Kotlin?