Android原生資料庫操作
阿新 • • 發佈:2020-11-24
原生資料庫框架
SQLite Databases
介紹一下
SQLite 是一種資料庫,使我們的應用和與之互動的裝置上建立一個本地資料庫。Lite 一詞是指典型資料庫的輕量級版本(lightweight version)。對應地就存在著重量級資料庫,例如 MySQL,它可以提供更加複雜的功能。SQLite 不需要伺服器,資料儲存在裝置的本地文字檔案裡。SQLite 是免費開源的,並且是 Android 自帶的資料庫這就是為什麼需要學習這一特定型別的資料庫。
首先建立資料庫管理類:
class MySQLiteHelper( context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int ) : SQLiteOpenHelper(context, name, factory, version) { val sql1 = "create table User(id integer primary key autoincrement, name text(4),address text(5))" val sql2 = "create table Test1 (id integer primary key autoincrement, name text(4),address text(5))" override fun onCreate(db: SQLiteDatabase?) { db!!.execSQL(sql1) } override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { when (oldVersion) { 1 -> db!!.execSQL(sql1) } } }
十分簡單的程式碼,整合抽象類SQLiteOpenHelper,實現裡面的兩個抽象方法:
- onCreate 第一次建立資料庫時呼叫 這裡通常用來做表的建立
- onUpgrade 當資料庫版本改變進行呼叫,通常用來做修改表和備份過載,其中老版本和新版本號一同傳入該方法作為我們判斷從某個版本過渡到另一個版本的邏輯
接下來即可在其他地方使用:
//引數User為資料庫名稱 1為該資料庫的版本號
val mySQLiteHelper = MySQLiteHelper(applicationContext, "TestDatabase", null, 1)
這樣我們的資料庫就創建出來了
- 接下來使用getWritableDatabase()或getReadableDatabase()方法獲取一個用於操作資料庫的SQLiteDatabase例項。
- getWritableDatabase() 方法以讀寫方式開啟資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。
- getReadableDatabase()方法則是先以讀寫方式開啟資料庫,如果資料庫的磁碟空間滿了,就會開啟失敗,當開啟失敗後會繼續嘗試以只讀方式開啟資料庫。如果該問題成功解決,則只讀資料庫物件就會關閉,然後返回一個可讀寫的資料庫物件。
接下來我們用getWritableDatabase()進行操作資料庫:
val writableDatabase = mySQLiteHelper.getWritableDatabase();
有了SQLiteDatabase物件即可進行資料庫的CRUD等操作
其中有兩種常用操作方法:
- 直接用執行SQL語句
- 使用SQLiteDatabase物件封裝的方法
增
方式一:
val insert: String = StringBuilder()
.append("insert into User(name,address) values ('")
.append("Elizabeth").append("','").append("beijing").append("')")
.toString()
writableDatabase.execSQL(insert)
方式二
val contentValues = ContentValues()
contentValues.put("name", "Elizabeth2")
contentValues.put("address","shanghai")
//第二個引數是要指定插入的列,null表示插入所有列, 第三個引數是 `ContentValues` 物件,將要填入資料庫中的資料
writableDatabase.insert("User", null, contentValues)
查:
方式一
val query = "select * from User"
val cursor = writableDatabase.rawQuery(query, null)
while (cursor.moveToNext()){
println("查詢到: ${cursor.getString(cursor.getColumnIndex("id"))} ${cursor.getString(cursor.getColumnIndex("name"))} ${cursor.getString(cursor.getColumnIndex("address"))}")
}
方式二
val selection = "address = ?"
val str = arrayOf("shanghai")
//第二個引數是要查詢的列,
//第三、第四個引數是要查詢的條件,?是佔位符
//後面三個分別是gruopby having 和 orderBy
val cursor = writableDatabase.query("User", null, selection, str, null, null, null)
while (cursor.moveToNext()){
println("查詢到: ${cursor.getString(cursor.getColumnIndex("id"))} ${cursor.getString(cursor.getColumnIndex("name"))} ${cursor.getString(cursor.getColumnIndex("address"))}")
}
刪:
方式二
writableDatabase.delete("User", "name = ? or address = ?", arrayOf("Elizabeth", "address"))
改:
方式二:
val contentValues = ContentValues()
contentValues.put("name", "Elizabeth2")
contentValues.put("address", "dalian")
writableDatabase.update("User", contentValues, "id = ?",
arrayOf("2")
)
資料庫版本升級操作
場景:
app升級後資料庫版本需要從V1.0升級到V2.0,那麼老使用者是安裝了V1.0需要升級到v2.0,這時不會走繼承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,因此我們需要在onUpgrade中寫更新程式碼V1.0->V2.0,當又有新版本V3.0時,這是就需要寫兩個更新程式碼:V1.0->V3.0和V2.0->V3.0 或者說只增加V2.0->V3.0的更新程式碼,然後進行逐級更新:V1.0->V2.0->V3.0