標籤:android sqlite 增刪改查 資料庫 基礎
一、概述
SQLite是Android系統的核心資料存放區服務之一,它是一個輕型的嵌入式資料庫,佔用非常少的資源卻能提供很好很快的資料存取服務,許多大型的需要資料存放區的Android項目都有用到SQLite(也可以用於傳統型應用程式)。
下面介紹一下SQLite的建立資料庫、表的操作,以及基本的增刪改查操作。
二、基本操作API簡介
在Android中,SQLiteDatabase類提供了SQLite的底層API,但在使用SQLite資料庫時,我們往往不會直接操作SQLiteDatabase這個類,而是自己建立一個繼承自SQLitOpenHelper的子類來實現資料庫操作。這樣做的目的一是為了以後如果資料庫升級不至於要改動太多代碼,已實現封裝;二則是為了我們使用更方便。
1、建立資料庫和表
SQLiteOpenHelper是一個抽象類別,在這個類裡有兩個抽象方法,OnCreate和OnUpgrade,前者用於第一次建立資料庫,後者用於資料庫升級,建立類DBServices如下:
public class DBServices extends SQLiteOpenHelper{ final static int version = 1; final static String dbName = "plan"; public DBServices(Context context){ super(context,dbName,null,version); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //建立今日計劃表 String create_today_plan_sql = "CREATE TABLE [_today_plan] (" + "[_Date] varchar(10) not null," + "[Item] varchar(200)," + "[Check] varchar(5) )"; db.execSQL(create_today_plan_sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub }}
樣本裡定義兩個變數,一個是資料庫的版本號碼,一個是資料庫名。當Android應用運行時,SQLiteOpenHelper會先檢查是否已經存在資料庫,如果不存在,就建立資料庫,然後開啟資料庫,最後調用OnCreate方法,所以我們需要再OnCreate中建立表(視圖等);如果資料庫已存在,而版本號碼比上次建立的資料庫版本號碼高,就調用OnUpgrade,用於升級。
2、資料的增——insert
在建立了資料庫和表之後,我們就可以給資料庫和表添加資料了。
添加資料的操作和其他資料庫一樣,也是使用insert,只是SQLite的insert是函數,而且使用起來非常方便,下面是方法(屬於上面的DBServices類,附錄裡有完整代碼):
public void insert(String table, String nullColumnHack, ContentValues values){ SQLiteDatabase db = this.getWritableDatabase(); db.insert(table, nullColumnHack, values); }
參數說明:
table:表名,直接使用字串指定;
nullColumnHack:指定null值的列,SQLite裡不允許空行,使用這個參數可以指定一個列的值為null,當存入行為空白時,這個列的值就被指定為null;
values:使用類似map索引值對映射的資料結構ContentValues來指定插入的資料
添加資料樣本:
String[] args = { today, content, Boolean.toString(checked) }; String[] column = { "[_Date]", "[Item]", "[Check]" }; //資料庫中添加資料 ContentValues c = new ContentValues(); for(int i=0;i<args.length;i++){ c.put(column[i], args[i]); } dbServices.insert("_today_plan", null, c);
3、資料的刪——delete
刪除和添加一樣,也是通過傳入參數調用方法來實現,方法:
public void delete(String table , String whereClause , String[] whereArgs){ SQLiteDatabase db = this.getWritableDatabase(); db.delete(table, whereClause, whereArgs); Log.d("Delete",whereClause); }
參數說明:
table:表名;
whereClause:可選,指定刪除條件,相當於SQL語句WHERE語句之後的類容,可通過?來指定參數;
whereArgs:當whereClause指定了?參數,這個字串數組裡就是?所代表的參數,個數應與?數一致;
刪除資料樣本:
String args[] ={ today, content, Boolean.toString(checked)};dbServices.delete("_today_plan", "[_Date]=? and [Item]=? and [Check]=?",args);
4、資料的修改——update
修改與添加、刪除相差不多,下面是update方法:
public void update(String table, ContentValues values, String whereClause, String[] whereArgs){ SQLiteDatabase db = this.getWritableDatabase(); db.update(table, values, whereClause, whereArgs); }
參數說明:
table:表名;
values:同上,是需要修改的列和值的映射集合;
whereClause:修改的行所需符合的條件;
whereArgs:指定條件裡的參數;
修改資料樣本:
String args[] ={ today, content, Boolean.toString(!m)};ContentValues c = new ContentValues();c.put("[Check]", Boolean.toString(m));dbServices.update("_today_plan", c,"[_Date]=? and [StartTime]=? and [Item]=? and [Check]=?",args);
5、資料的查詢——read
在這裡就和前面有所不同了,讀取資料所用的方法是直接執行查詢語句,擷取遊標,然後通過遊標來遍曆資料庫,方法如下:
public Cursor read(String sql ,String[] args){ SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, args); Log.d("Database",cursor.getColumnName(0)); return cursor; }
方法說明:
請注意:在這裡db擷取的是唯讀資料庫(getReadableDatabase),而在上述三種操作裡都是使用的可寫資料庫(getWritableDatabase);至於遊標的用法此處就不再贅述,只需看一下API的名字就能掌握基本用法,但最後一定要記得將遊標關閉(close)!
三、附錄
附錄了DBServices類,僅作參考
package com.plan;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class DBServices extends SQLiteOpenHelper{ final static int version = 1; final static String dbName = "plan"; public DBServices(Context context){ super(context,dbName,null,version); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub //建立今日計劃表 String create_today_plan_sql = "CREATE TABLE [_today_plan] (" + "[_Date] varchar(10) not null," + "[Item] varchar(200)," + "[Check] varchar(5) )"; db.execSQL(create_today_plan_sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } public Cursor read(String sql ,String[] args){ SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, args); Log.d("Database",cursor.getColumnName(0)); return cursor; } public void insert(String table, String nullColumnHack, ContentValues values){ SQLiteDatabase db = this.getWritableDatabase(); db.insert(table, nullColumnHack, values); } public void delete(String table , String whereClause , String[] whereArgs){ SQLiteDatabase db = this.getWritableDatabase(); db.delete(table, whereClause, whereArgs); Log.d("Delete",whereClause); } public void update(String table, ContentValues values, String whereClause, String[] whereArgs){ SQLiteDatabase db = this.getWritableDatabase(); db.update(table, values, whereClause, whereArgs); }}
有關SQLite的進階特性,如索引、視圖以及觸發器等,大家可以去看看SQlite的官方文檔。另外,如果一次性添加(刪除等)的資料量比較大的話,建議使用交易處理,可以大幅提高效率和可靠性。
【Android基礎篇】SQLite資料庫的增刪改查基本操作