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
}