新增一個Activity,用來寫入資料
建立一個Data Class儲存資料,為了方便在資料庫內做操作,除了風味的描述,還要加入一個欄位作為資料的ID
data class notes(
val id:Long,
val name:String,
val acidity:Int,
val bitter:Int,
val sweet:Int,
val ways:String,
val flavor:String
)
SQLite是一個由C語言編寫的小型資料庫管理系統,APP可以將資料儲存在手機上的SQLite
新增一個Class,繼承SQLiteOpenHelper就可以使用其功能
有兩個需要override的function
onCreate()
onUpgrade
class DBHelperMyDBHelper(context: Context, name:String = database, factory: SQLiteDatabase.CursorFactory? = null, version: Int = v) :
SQLiteOpenHelper(context, name, factory, version) {
companion object{
private const val database = "database.db" //資料庫的名稱
private const val v = 1//資料庫的版本號
}
override fun onCreate(db: SQLiteDatabase){
//當資料庫建立時執行
}
override fun onUpgrade(db : SQLiteDatabase, oldVersion: Int, newVersion : Int) {
//當資料庫版本需要更新時執行
}
}
在資料庫中,資料以表格(Table)的方式儲存,所以必須要先建構好欄位才能開始使用。資料庫就像一個欄數固定,但列數可以不斷增加的表格,例如:要記錄學生的學號、性別和姓名,就必須要讓資料庫有三個欄位,之後加進的資料也只能有三個值(欄),但可以加入多筆的資料(列)
對資料庫進行操作時要使用SQL中的CREATE TABLE
指令
//建立一個叫Notes的Table
CREATE TABLE Notes()
小括號中的內容代表Table的欄位,一個Table可以有多個欄位,每個欄位都要有一個名稱和型別,SQL中只有三種型態
通常在還會再欄位中加入NOT NULL,表示欄位不允許為空
依照這次需要的欄位,指令為:
CREATE TABLE Notes(id INTEGER NOT NULL,name TEXT NOT NULL,acidity INTEGER NOT NULL,bitter INTEGER NOT NULL,sweet INTEGER NOT NULL,ways TEXT NOT NULL,flavor TEXT NOT NULL)
一個表格中,必須有一個欄位為"主鍵",作為索引值,主鍵的值不能和其他列的主鍵重複
這邊將id的欄位設為主鍵,加上PRIMARY KEY(主鍵不能為空,所以不用加NOT NULL)
CREATE TABLE Notes(id INTEGER PRIMARY KEY,name TEXT NOT NULL,acidity INTEGER NOT NULL,bitter INTEGER NOT NULL,sweet INTEGER NOT NULL,ways TEXT NOT NULL,flavor TEXT NOT NULL)
將這段指令加到onCreate
中
override fun onCreate(db: SQLiteDatabase){
//建立表格
db.execSQL("CREATE TABLE Notes(id INTEGER PRIMARY KEY,name TEXT NOT NULL,acidity INTEGER NOT NULL,bitter INTEGER NOT NULL,sweet INTEGER NOT NULL,ways TEXT NOT NULL,flavor TEXT NOT NULL)")
}
當資料庫的版本需要更新時,要將舊的表格移除再重新建立,這個動作會在onUpgrade()
中執行
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
//當表格存在時刪除表格
db.execSQL("DROP TABLE IF EXISTS Notes")
//重新創建表格
onCreate(db)
}
透過.writableDatabase
建立資料庫的物件,之後對資料庫的操作都需要使用到這個物件
val db = DBHelper(this).writableDatabase
在EditActivity中,將各元件的數值轉為我們需要的資料,並儲存到資料庫
btn_add.setOnClickListener {
val db = DBHelper(this).writableDatabase
val Id = System.currentTimeMillis()
db.execSQL(
"INSERT INTO Notes(id,name,acidity,bitter,sweet,ways,flavor) VALUES(?,?,?,?,?,?,?)",
arrayOf<Any?>(Id,"${ed_name.text}",seekBar_acidity.progress,seekBar_bitter.progress,seekBar_sweet.progress,"${ed_name.text}","${ed_flavor.text}")
)
}