iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
1
Software Development

高中生Kotlin實作30天系列 第 13

Day 13 咖啡風味紀錄(SQLite 新增資料)

  • 分享至 

  • xImage
  •  

Layout

新增一個Activity,用來寫入資料

Method

建立一個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 DataBase

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中只有三種型態

  • INTEGER 整數,包括:byte、short、int、long
  • REAL 浮點數,包括:flaot、double
  • TEXT 字串,string

通常在還會再欄位中加入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}")
    )
}

上一篇
Day 12 提示訊息(Toast + AlertDialog)
下一篇
Day 14 咖啡風味紀錄(SQLite 讀取)
系列文
高中生Kotlin實作30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言