我是Kotlin的新手。我正在开发一个 "个性猜测 "的应用程序。它本来工作得很好,但是当我添加了SQLite数据库,当我运行时,当我到达集成了SQLite的活动时,它一直崩溃。
错误日志:2020-06-04 13:18:10.757 16744-16744? Eexample.guessm: Runtime_flags中设置了未知位。0x80002020-06-04 13:18:12.088 16744-16776com.example.guessme EeglCodecCommon: glUtilsParamSize: unknow param 0x000082da2020-06-04 13:18:12.088 16744-16776com. example.guessme EeglCodecCommon: glUtilsParamSize: unknow param 0x000082da2020-06-04 13:18:33.961 16744-16744com.example.guessme EAndroidRuntime: FATAL EXCEPTION: main Process: com.example.guessme, PID: 16744 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.guessmecom.example.guessme.QuizActivity}: java.lang.IllegalStateException: getDatabase called recursively at android.app.ActivityThread.exampleLaunchActivity(ActivityThread.java:3270) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction. LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction. TransactionExecutor.executor(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler. java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com. android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: 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 com.example.guessme.DbHelper.addQuestions(DbHelper.kt:80) at com.example.guessme.DbHelper.addQuestions(DbHelper.kt:45) at com.example.guessme.DbHelper.addQuestions(DbHelper.kt:45) at com.example. guessme.DbHelper.onCreate(DbHelper.kt:35) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:412) at android.database.sqlite.SQLiteOpenHelper. getReadableDatabase(SQLiteOpenHelper.java:341) at com.example.guessme.DbHelper.getAllQuestions(DbHelper.kt:93) at com.example.guessme.QuizActivity.onCreate(QuizActivity.kt:29) at android. app.Activity.performCreate(Activity.java:7802) at android.app.Activity.performCreate(Activity.java:7791) at android.app.Instrumentation.callActivityOnCreate(Instrumentation. java:1299) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android. app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在android.app.servertransaction.TransactionExecutor.executor.executeCallbacks(TransactionExecutor.java:135) 在android.app.servertransaction.TransactionExecutor.executor.execute(TransactionExecutor.java:95) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)。 os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflection.Method.invoke(Native Method). Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
DbHelper类中onCreate方法的代码片段。
private val DATABASE_VERSION = 2
// Database Name
private val DATABASE_NAME = "PersonalityQuiz.db"
// tasks table name
lateinit var dbase: SQLiteDatabase
class DbHelper (context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
dbase = db
val sql = ("CREATE TABLE IF NOT EXISTS " + TABLE_QUEST + " ( "
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUES
+ " TEXT, " + KEY_OPTA + " TEXT, "
+ KEY_OPTB + " TEXT, " + KEY_OPTC + " TEXT)")
db.execSQL(sql)
addQuestions()
db.close()
}
addQuestions函数的代码片段,我在该函数中插入问题到数据库中。
// Adding new question
fun addQuestion(quest: Question) {
dbase = this.writableDatabase
val values = ContentValues()
values.put(KEY_QUES, quest.getQUESTION())
values.put(KEY_OPTA, quest.getOPTA())
values.put(KEY_OPTB, quest.getOPTB())
values.put(KEY_OPTC, quest.getOPTC())
// Inserting Row
dbase.insert(TABLE_QUEST, null, values)
}
onUpgrade方法的代码片段。
override fun onUpgrade(db: SQLiteDatabase, oldV: Int, newV: Int) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS $TABLE_QUEST")
// Create tables again
onCreate(db)
}
你无法访问 writableDatabase
内 onCreate()
.
要么移除 addQuestions()
来自 onCreate()
,或通过 SQLiteDatabase
从 onCreate()
作为参数,向 addQuestions()
.