Android SQLite數據庫基礎總結打賞

SQLite是Android平臺軟件開發中會經常用到的數據庫產品,作為一款輕型數據庫,SQLite的設計目標就是是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠。

下面我們一起來看看針對Android平臺的SQlite 3的使用。
以下概念都是在Android平臺的SQlite限制下的理解:
數據庫基礎概念
SQlite 通過文件來保存數據庫,一個文件就是一個數據庫。
數據庫里又包含數個表格;
每個表格里面包含了多個記錄;
每個記錄由多個字段組成;
每個字段都有其對應的值;
每個值都可以指定類型。

數據庫名稱即文件名;表格有自己的名稱;記錄沒有名稱;每個字段都有名稱。在SQlite中,記錄沒有順序的概念,不存在第一、第二此類的概念;只能通過查詢來獲取滿足條件的記錄。我們通過執行SQL指令來操作數據庫。

Android平臺下數據庫相關類

SQLiteOpenHelper 抽象類:通過從此類繼承實現用戶類,來提供數據庫打開、關閉等操作函數。

SQLiteDatabase 數據庫訪問類:執行對數據庫的插入記錄、查詢記錄等操作。

SQLiteCursor 查詢結構操作類:用來訪問查詢結果中的記錄。
創建數據庫

假設使用一個數據庫存儲一個表格,表格中保存了多條記錄,每個記錄包含3個字段,分別是: ID、name、age。 從SQLiteOpenHelper繼承實現一個類,所有對數據庫的操作都封裝在此類中。

構造函數:

java代碼:

public?DbHelper(Context?context,?String?name,?CursorFactory?factory,?int?version){
super(context,?name,?factory,?version);
}

此函數中的參數name就是數據庫名稱,也就是數據庫文件名; version則從1開始,當將來數據庫的表格以及字段發生變化時,用戶可以提高此version,從而觸發onUpgrade()達到舊數據升級的效果。在onCreate函數中創建表格:

java代碼:

public?void?onCreate(SQLiteDatabase?db)?{
    StringBuilder?sql?=?new?StringBuilder();
    sql.append("CREATE?TABLE?");
    sql.append(TBL_NAME);
    sql.append("?(");
    sql.append(FIELD_ID?+?"?TEXT?PRIMARY?KEY?NOT?NULL,?");
    sql.append(FIELD_NAME?+?"?TEXT,?");
    sql.append(FIELD_AGE?+?"?INTEGER");
    sql.append(");");
    db.execSQL(sql.toString());
}

onCreate函數只會在數據庫第一次創建時調用,所以此處適合做一些數據庫初始化操作。上面的函數最終實際上效果是執行了SQL語句:

java代碼:

CREATE?TABLE?mytable?(id?TEXT?PRIMARY?KEY?NOT?NULL,?name?TEXT,?age?INTEGER);

向表格中添加數據有兩種方式可以向表格中添加數據,一種是通過SQLiteDatabase提供的execSQL函數直接執行SQL指令; 一種是通過SQLiteDatabase提供的insert函數,此函數把SQL語句進行了封裝方便用戶使用。

通過execSQL("INSERT INTO mytable VALUES('idStr', 'nameStr', 20);");可以插入一條記錄,

當插入記錄出錯時會拋出異常需要處理。

通過insert函數:insert函數需要一個ContentValues類型的值,此類型類似于hashmap,一個key,一個值配成一對。key就是字段名。

java代碼:

ContentValues?v?=?new?ContentValues();
	v.put("id",?"101");
	v.put("name",?"user?101");
	v.put("age",?44);
	mDb.insert("mytable",?"null",?v);

如果v中的key沒有完全的指定所有字段,比如少name或者少id,那么記錄能否被成功插入要根據表格創建時的字段限制來決定, 比如少name,那么此記錄會插入,只是name字段的值為NULL;如果少id,那么記錄不會被插入,因為創建時指定了NOT NULL.可以通過以下指令來查看結果:adb shell執行后進入shell;cd /data/data/cn.demo.sqlsqlite3 database.db 進入了sqlite操作界面。.help可以看到命令幫助。

.dump 可以看到數據庫中的數據。

為了方便使用,可以自定義一個insert函數,將值通過參數傳入,而ContentValues設置則在函數內部實現。

java代碼:

public?void?insert(String?id,?String?name,?int?age)?{
	if(?mDb?==?null?)?mDb?=?getWritableDatabase();
	ContentValues?v?=?new?ContentValues();
	v.put("id",?id);
	v.put("name",?name);
	if(age?>?0)?v.put("age",?age);
	mDb.insert(TBL_NAME,?"null",?v);

從表格中查詢記錄SQL語句:SELECT column list FROM table WHERE expr ORDER BY column list; 通過SQLiteDatabase類的query()函數

Java代碼:

Cursor?SQLiteDatabase.query(String?table,
String[]?columns,?String?selection,?String[]?selectionArgs,
String?groupBy,?String?having,?String?orderBy);

Parameters:

table 要更新的記錄所在的表名。

values 要更新的字段值。

whereClause Where子句。更新哪些記錄。

whereArgs Where子句中的'?'替換串。

執行update操作時,如果只給部分字段賦值,那么update后,沒有賦值的字段仍然保持原來的值不變。從表格中刪除記錄:

java代碼:

int?SQLiteDatabase.delete(String?table,?String?whereClause,?String[]?whereArgs);

另外,很多時候我們也許需要在手機或者模擬器上進行實際的調試工作,使用Android SDK內自帶的SQLiteOpenHelper,可以方便的對SQLite數據庫進行操作,由于手機平臺所限,手機上的SQLite不能進行非常復雜的select,但是一般的增刪改查功能也相當齊全,足夠滿足移動平臺的使用。下面收集整理了部分增刪查改的實現語句,供參考。

首先,我們需要繼承SQLiteOpenHelper這個類,并覆蓋兩個抽象方法

public class TestDatabase extends SQLiteOpenHelper {
        public TestDatabase(Context context) {
                // 創建一個名為test_db的數據庫
                super(context, "test_db", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
//執行時若表不存在則創建,且SQLite數據庫中必須有一個_id的字段做主鍵,否則查詢將報錯
                String sql = "create table mytable (
_id integer primary key autoincrement,stext text)";
                db.execSQL(sql);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // 數據庫被改變時,將原先的表刪除,然后建立新表
                String sql = "drop table if exists mytable";
                db.execSQL(sql);
                onCreate(db);
        }
}

下面是一些基礎的增刪查改。

public Cursor select() {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cur = db.query("mytable", null, null, null, null, null, null);
        return cur;
}

public long insert(String text){
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("stext", text);
        long row = db.insert("mytable", null, cv);
        return row;
}

public int delete(int id){
        SQLiteDatabase db = getWritableDatabase();
        String where = "_id=?";
        String[] whereValue = {Integer.toString(id)};
        return db.delete("mytable", where, whereValue);
}

public int update(int id, String text){
        SQLiteDatabase db = getWritableDatabase();
        String where = "_id=?";
        String[] whereValue = {Integer.toString(id)};
        ContentValues cv = new ContentValues();
        cv.put("stext", text);
        return db.update("mytable", cv, where, whereValue);
}

其中db.query方法參數比較復雜,這里全部置null是為了圖個省事,它的具體參數如下:
public Cursor query (String table,String[] columns, String selection, String[] selectionArgs, StringgroupBy, String having, String orderBy)

table: 表名稱,不可為null
columns: 要返回的列名數組,置null表示返回所有列
selection: where子句,如果不需要where子句則置null,寫法如"_id=?",此處將要填的參數寫為?,供下方的selectionArgs填充
selectionArgs: where子句的所需值,該數組將依次填充selection中的每一個問號。
groupby: GroupBy子句
having: Having子句
orderBy: order by 子句

更多的功能還有待大家自己去發掘吧。

Android SQLite數據庫基礎總結
文章《Android SQLite數據庫基礎總結》二維碼
  • 微信打賞
  • 支付寶打賞

已有6條評論

  1. 游客 690

    爽。。我都羨慕了。

    2012-06-07 16:04 回復
  2. 張黎

    一排代碼看的我眼花繚亂

    2012-05-28 18:20 回復
  3. 珠寶網

    看似簡單,可惜我還是不懂

    2012-05-28 16:57 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖