getDatabase在Android中递归调用Kotlin

getDatabase在Android中递归调用Kotlin,android,sqlite,kotlin,android-room,Android,Sqlite,Kotlin,Android Room,当执行以下操作时,我得到了错误。我向populatedDatabase发送了一个DAO,但它只是给了我一个错误,我不确定我做错了什么 companion object { @Volatile private var INSTANCE: LoanHubDatabase? = null fun getDatabase(context: Context, scope: CoroutineScope): LoanHubDatabase {

当执行以下操作时,我得到了错误。我向
populatedDatabase
发送了一个DAO,但它只是给了我一个错误,我不确定我做错了什么

companion object {

        @Volatile
        private var INSTANCE: LoanHubDatabase? = null

        fun getDatabase(context: Context, scope: CoroutineScope): LoanHubDatabase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }

            synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    LoanHubDatabase::class.java,
                    "LoanHub_Database"
                ).addCallback(UserDatabaseCallback(scope))
                    .allowMainThreadQueries()
                    .fallbackToDestructiveMigration()
                    .build()
                INSTANCE = instance
                return instance
            }

        }

    } 


private class UserDatabaseCallback(private val scope: CoroutineScope) :
        RoomDatabase.Callback() {

        @RequiresApi(Build.VERSION_CODES.O)
        override fun onOpen(db: SupportSQLiteDatabase) {
            super.onOpen(db)
            INSTANCE?.let { database ->
                scope.launch {(Dispatchers.IO)
                    populateDatabase(database.LoanDao())
                }

            }
        }

        @RequiresApi(Build.VERSION_CODES.O)
        suspend fun populateDatabase(loanDao: LoanDao)  {

            val loan = Loan(0, "Sagicor", "Ready Loan", 800000, 8.0, "70 months", 100.00,70, "The ready loan is the best loan", "Women","Active", "2020-01-01")
            loanDao.addNewLoan(loan)

        }
我收到的错误是:

java.lang.IllegalStateException: getDatabase called recursively
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:357)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:317)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:92)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:53)
        at androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476)
        at androidx.room.CoroutinesRoom$Companion.execute(CoroutinesRoom.kt:45)
        at androidx.room.CoroutinesRoom.execute(Unknown Source:2)
        at com.uwi.loanhub.models.LoanDao_Impl.addNewLoan(LoanDao_Impl.java:95)

尝试用onCreate替换onOpen方法


我认为您正在尝试在创建数据库之前编写。共享您的实例变量代码。@sadat使用您请求的代码进行了更新正如我前面所说的,您在创建之前正试图在数据库上编写代码。现在,如果数据库没有创建,它将调用onCreate,然后循环再次发生。如果有效,你可以认为答案是正确的。谢谢,如果你用onCreate替换了onOpen,我应该把
populatedDatabase
函数放在哪里呢。应该没问题。我做了,但是没有调用函数
populateDatabase
override fun onOpen(db: SupportSQLiteDatabase) {
            super.onOpen(db)
//rest of your code
}
override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)
//rest of your code
}