[在Android中使用Kotlin SQLite的增量ID

问题描述 投票:0回答:1

我想使用Kotlin和SQLite创建测验应用程序,以存储测验问题和答案。这是我的期望。

enter image description here

我想要COL_ID增量,只要创建测验即可。我尝试自动递增并将COL_ID更改为_ID,但根本无法正常工作。任何帮助,将不胜感激。

class DBHelper(context: Context):SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VER) {

    companion object{
        private val DATABASE_VER = 1
        private val DATABASE_NAME = "quizz.db"

        private val TABLE_NAME="Quiz"
        private val COL_ID = "id"
        private val COL_QUESTION="Question"
        private val COL_ANS1 = "Ans1"
        private val COL_ANS2 = "Ans2"
        private val COL_ANS3 = "Ans3"
        private val COL_ANS4 = "Ans4"
    }

    override fun onCreate(db: SQLiteDatabase?){ //$COL_ID should start from 1..2..
        val CREATE_TABLE_QUERY:String = ("CREATE TABLE $TABLE_NAME ($COL_ID INTEGER PRIMARY KEY, $COL_QUESTION TEXT, $COL_ANS1 TEXT, $COL_ANS2 TEXT, $COL_ANS3 TEXT, $COL_ANS4 TEXT) ")
        db!!.execSQL(CREATE_TABLE_QUERY);
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
        onCreate(db!!)
    }


    val allQuiz:List<Quiz>
        get(){
            val lstQuiz = ArrayList<Quiz>()
            val selectQuery = "SELECT * FROM $TABLE_NAME"
            val db = this.writableDatabase
            val cursor = db.rawQuery(selectQuery, null)
            if(cursor.moveToFirst()){
                do{
                    val quiz = Quiz()
                    quiz.id = cursor.getInt(cursor.getColumnIndex(COL_ID))
                    quiz.question = cursor.getString(cursor.getColumnIndex(COL_QUESTION))
                    quiz.choice = cursor.getString(cursor.getColumnIndex(COL_ANS1))
                    quiz.choice2 = cursor.getString(cursor.getColumnIndex(COL_ANS2))
                    quiz.choice3 = cursor.getString(cursor.getColumnIndex(COL_ANS3))
                    quiz.choice4 = cursor.getString(cursor.getColumnIndex(COL_ANS4))

                    lstQuiz.add(quiz)
                }while(cursor.moveToNext())
            }
            db.close()
            return lstQuiz
        }

    fun addQuiz(quiz: Quiz){
        val db = this.writableDatabase
        val values = ContentValues()
        values.put(COL_ID, quiz.id)
        values.put(COL_QUESTION, quiz.id)
        values.put(COL_ANS1, quiz.id)
        values.put(COL_ANS2, quiz.id)
        values.put(COL_ANS3, quiz.id)
        values.put(COL_ANS4, quiz.id)

        db.insert(TABLE_NAME, null, values)
        db.close()
    }

    fun UpdateQuiz(quiz:Quiz):Int{
        val db = this.writableDatabase
        val values = ContentValues()
        values.put(COL_ID, quiz.id)
        values.put(COL_QUESTION, quiz.id)
        values.put(COL_ANS1, quiz.id)
        values.put(COL_ANS2, quiz.id)
        values.put(COL_ANS3, quiz.id)
        values.put(COL_ANS4, quiz.id)

        return db.update(TABLE_NAME, values, "$COL_ID=?", arrayOf(quiz.id.toString()))
        db.close()
    }
}

这是我在onCreate()中的add_quiz函数

db = DBHelper(this)

refreshData()

button_save.setOnClickListener {
   val add_quiz = Quiz {
   //Integet.parseInt //get stuck
   et_question.text.toString(),
   et_choice1.text.toString(),
   et_choice2.text.toString(),
   et_choice3.text.toString(),
   et_choice4.text.toString()
   }
   db.addQuiz(add_quiz)
}
android sqlite kotlin
1个回答
1
投票

而不是:

CREATE TABLE $TABLE_NAME ($COL_ID INTEGER PRIMARY KEY, $COL_QUESTION TEXT, $COL_ANS1 TEXT, $COL_ANS2 TEXT, $COL_ANS3 TEXT, $COL_ANS4 TEXT)

您可以将主键设置为autoincrement

CREATE TABLE $TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_QUESTION TEXT, $COL_ANS1 TEXT, $COL_ANS2 TEXT, $COL_ANS3 TEXT, $COL_ANS4 TEXT)

并且不要在addQuiz()中设置ID。在addQuiz方法中删除values.put(COL_ID, quiz.id)

这将创建一个序列并从中获取值,而无需管理它。

另一种选择是使用隐式创建的rowid

SQLite隐式创建一个名为rowid的列,并在您向表中插入新行时自动分配一个整数值。

您可以在https://www.sqlitetutorial.net/sqlite-autoincrement/中找到有关此内容及其好处的更深入的解释>

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