前言
在android開發(fā)過程中,免不了使用數(shù)據(jù)庫的問題。Android自帶數(shù)據(jù)庫SQLite,今天就讓我們來學習Android環(huán)境下SQLite數(shù)據(jù)庫吧。
今天涉及知識點有:
- SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)庫基礎(chǔ)
- 數(shù)據(jù)庫基本操作
- SQLite數(shù)據(jù)庫的使用
- 需要注意的問題
- 效果圖和項目結(jié)構(gòu)圖
- 源碼
先來波效果圖

一. SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)庫基礎(chǔ)
SQLiteDatabase是SQLite數(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)注的是兩個點:SQLiteDatabase和SQLiteOpenHelper
二. 數(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)圖


六. 源碼
這里涉及到的源碼有兩個類:
- DatabaseHandler : 創(chuàng)建
SQLite數(shù)據(jù)庫 - DbHelper:處理具體的數(shù)據(jù)操作(增刪改查)
先給出DatabaseHandler代碼: