Kotlin筆記(56) — SQLiteOpenHelper實現(xiàn)數(shù)據(jù)庫

前言

android開發(fā)過程中,免不了使用數(shù)據(jù)庫的問題。Android自帶數(shù)據(jù)庫SQLite,今天就讓我們來學習Android環(huán)境下SQLite數(shù)據(jù)庫吧。

今天涉及知識點有:

  1. SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)庫基礎(chǔ)
  2. 數(shù)據(jù)庫基本操作
  3. SQLite數(shù)據(jù)庫的使用
  4. 需要注意的問題
  5. 效果圖和項目結(jié)構(gòu)圖
  6. 源碼

先來波效果圖


效果圖.gif

一. SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)庫基礎(chǔ)

SQLiteDatabaseSQLite數(shù)據(jù)庫管理類, SQLiteDatabase提供了很多操作數(shù)據(jù)庫的API,所以我們在要進行數(shù)據(jù)庫操作時,可以通過SQLiteDatabase對象進行。
要實現(xiàn)數(shù)據(jù)庫的業(yè)務(wù)數(shù)據(jù)的保存和讀取,我們還需要繼承SQLiteOpenHelper來實現(xiàn)。
所以在SQLite數(shù)據(jù)庫操作中,我們比較關(guān)注的是兩個點:SQLiteDatabaseSQLiteOpenHelper

二. 數(shù)據(jù)庫基本操作

下面來初步理解下SQLite數(shù)據(jù)庫的基本操作。
我們可以像下面這樣創(chuàng)建或打開一個數(shù)據(jù)庫:

   //創(chuàng)建數(shù)據(jù)庫,若已經(jīng)存在,則打開
   var db:SQLiteDatabase=mContext.applicationContext.openOrCreateDatabase("user.db",Context.MODE_PRIVATE,null) 

但以上代碼我們常用于打開一個已經(jīng)存在的數(shù)據(jù)庫。
要刪除一個數(shù)據(jù)庫文件的話,我們可以像下面這樣:

    /**刪除數(shù)據(jù)庫文件**/
    fun delateAllFiles(){
        mContext!!.applicationContext.deleteDatabase("user.db")
    }

那么,現(xiàn)在我們對SQLite數(shù)據(jù)庫已經(jīng)有一個基本的理解了,下面讓我們來繼續(xù)學習。

三. SQLite數(shù)據(jù)庫的使用

SQLite數(shù)據(jù)庫的操作無非涉及到增刪改查。然后大致邏輯是,繼承SQLiteOpenHelper實現(xiàn)一個類(這里我們給該類命名為DatabaseHandler),然后在DatabaseHandler類中實現(xiàn)數(shù)據(jù)庫的基本創(chuàng)建。在DatabaseHandler中對SQLiteDatabase進行實例化(一般我們對SQLiteDatabase進行單例處理,為的是防止多個SQLiteDatabase造成數(shù)據(jù)庫連接太多)
這里我繼承SQLiteOpenHelper寫了一個DatabaseHandler用于創(chuàng)建SQLite數(shù)據(jù)庫,然后寫了一個數(shù)據(jù)庫操作幫助類DbHelper,具體的數(shù)據(jù)庫操作(增刪改查)均在DbHelper中進行。大致如下:

  • DatabaseHandler : 創(chuàng)建SQLite數(shù)據(jù)庫
  • DbHelper:處理具體的數(shù)據(jù)操作(增刪改查)

下面給出數(shù)據(jù)庫在MainActivity中使用代碼:

open class MainActivity : AppCompatActivity(), View.OnClickListener {

    private var mDbHelper:DbHelper= DbHelper(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initData()
        setListener()
    }

    private fun initData() {

    }

    private fun setListener(){
        mBtnTest.setOnClickListener(this@MainActivity)
    }

    override fun onClick(v: View) {
        when (v.id) {
            R.id.mBtnTest -> {
                //測試
                test()
            }
        }
    }

    private fun test() {
        //刪除表中所有數(shù)據(jù)
        mDbHelper.delateAll()

        //查詢所有數(shù)據(jù)
        checkAllData()

        //插入
        LogUtil.i("=======執(zhí)行插入=======")
        for(index in 0 until 3) {
            var user: User = User("小明${index}", 12+index)
            mDbHelper.insert(user)
        }
        //查詢所有數(shù)據(jù)
        checkAllData()

        //修改"小明"年齡為500
        LogUtil.i("=======修改 小明0 的age為500=======")
        var user: User = User("小明0", 500)
        mDbHelper.update(user)
        //查詢所有數(shù)據(jù)
        checkAllData()

        //刪除
        LogUtil.i("=======刪除 小明1 =======")
        var user1: User = User("小明1", 13)
        mDbHelper.delete(user)
        //查詢所有數(shù)據(jù)
        checkAllData()
    }

    private fun checkAllData(){
        var buffer:StringBuffer= StringBuffer()

        var list:MutableList<User> = mDbHelper.checkAll()
        if(!list.isEmpty()) {
            for (bean in list) {
                LogUtil.i("name=${bean.name}  age=${bean.age}")
                buffer.append("name=${bean.name}  age=${bean.age}\n")
            }
            toast(buffer.toString())
        }else{
            toast("無數(shù)據(jù)")
        }
    }
}

四.需要注意的問題

需要注意的是,當我們直接刪除數(shù)據(jù)庫文件,類似如下:

    /**刪除數(shù)據(jù)庫文件**/
    fun delateAllFiles(){
        mContext!!.applicationContext.deleteDatabase("user.db")
    }

然后再執(zhí)行添加數(shù)據(jù),是可以重建數(shù)據(jù)庫文件及相關(guān)表文件并插入數(shù)據(jù)成功的。
然后如果我們是直接刪除該數(shù)據(jù)的某個表,然后再對該表執(zhí)行數(shù)據(jù)插入,是會報錯的,提示該表不存在,雖然我們在建表的時候有如下語句:

    override fun onCreate(db: SQLiteDatabase?) {
        var createTable:String =
            "CREATE TABLE IF NOT EXISTS ${TABLE_NAME}(${ID} integer NOT NULL PRIMARY KEY AUTOINCREMENT,\n" +
                    "                                ${NAME} text,\n" +
                    "                                ${AGE} integer);"
        //創(chuàng)建表
        db!!.execSQL(createTable)
    }

也還是不行的,這是需要注意的地方。

五.效果圖和項目結(jié)構(gòu)圖

效果圖.gif
項目結(jié)構(gòu)圖.png

六. 源碼

這里涉及到的源碼有兩個類:

  • DatabaseHandler : 創(chuàng)建SQLite數(shù)據(jù)庫
  • DbHelper:處理具體的數(shù)據(jù)操作(增刪改查)

先給出DatabaseHandler代碼:

還有 49% 的精彩內(nèi)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
支付 ¥4.00 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容