увеличить идентификатор с помощью Kotlin SQLite в Android - PullRequest
0 голосов
/ 04 марта 2020

Я хочу создать приложение для викторин, используя 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()
    }
}

, и вот моя функция add_quiz в onCreate ()

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)
}

1 Ответ

1 голос
/ 04 марта 2020

Вместо:

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 (). Удалите values.put(COL_ID, quiz.id) в методе addQuiz.

Это создаст последовательность и получит из нее значение без необходимости управлять им.

Другой вариант - использовать неявно созданный rowid .

SQLite неявно создает столбец с именем rowid и автоматически присваивает целочисленное значение при каждом добавлении новой строки в таблицу.

Более подробное объяснение можно найти. об этом и его преимуществах в https://www.sqlitetutorial.net/sqlite-autoincrement/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...