我想使用Kotlin和SQLite创建测验应用程序,以存储测验问题和答案。这是我的期望。
我想要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)
}
而不是:
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/中找到有关此内容及其好处的更深入的解释>