Kotlin: sqlite数据库表没有创建。

问题描述 投票:-2回答:1

我是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)
    }
database sqlite android-studio kotlin crash
1个回答
0
投票

你无法访问 writableDatabaseonCreate().

要么移除 addQuestions() 来自 onCreate(),或通过 SQLiteDatabaseonCreate() 作为参数,向 addQuestions().

© www.soinside.com 2019 - 2024. All rights reserved.