Android數據存儲(三)——SQLite

如果需要一個更加健壯的數據存儲機制,則需要使用一個關係型數據庫,在Android上,則爲SQLlite。

 

SQLite的特點:輕量級、嵌入式的、關係型數據庫。可移植性好,易使用,小,高效且可靠,與使用它的應用程序共用一個進程空間。

 

SQLite的缺點:不支持外鍵,需要手動利用觸發器控制。

 

我們先簡單的進行SQLite的操作學習:

      9.3.1 數據庫的創建和使用

    1.  SQLite的創建

    openOrCreateDatabase

openOrCreateDatabase("mydatabase.db",

SQLiteDatabase.CREATE_IF_NECESSARY,null);

代碼片段9.3.1.1 SQLite數據庫創建

 

註釋:創建返回值爲SQLiteDatabase,通過這個類,可以進行一系列的數據庫操作,包括增刪改查。

   

    2.  SQLite執行SQL

    SQLite可以直接執行SQL語句,不過它必須是執行語句,而非查詢語句,因爲它不會返回任何結果。

 

this.sqLiteDatabase.execSQL(SQLStr.CREATE_USER_TABLE);

代碼片段9.3.1.2 執行SQL創建表

   

    註釋:SQLStr.CREATE_USER_TABLE爲數據庫的建表語句:

public static final String CREATE_USER_TABLE ="CREATETABLE user (id INTEGER PRIMARY KEY,name TEXT NOT NULL)";

代碼片段9.3.1.3 SQL建表語句

   

   

    3.  外鍵約束

    這個是重點需要注意的,因爲SQLite(3.6.19)並不支持外鍵。所以,在使用外鍵的時候,必須要注意,需要手動創建觸發器,在增加、修改、刪除這三種情況下,執行定義的外鍵觸發器才行。

    因爲在Android2.3左右,使用的sqlite爲3.6.19以上版本,也就是它會支持外鍵約束,所以這裏的通過觸發器來自定義外鍵就不再描述。

   

    4.  增加記錄

    對於想表中增加數據,我們是通過建立一個ContentValues的對象,將需要插入的數據字段名和值進行配對寫入。

ContentValues values = new ContentValues();

      values.put("id", 1);

      values.put("name", "admin");

this.sqLiteDatabase.insert("user",null, values);

代碼片段9.3.1.4 增加語句

    註釋:insert語句有三個參數,分別代表爲表名、values某列爲空時插入的值、傳入的列與值。

   

    5.  更新記錄

    對於需要表中需要修改的數據,只需要將對應的列和修改後的值,保存到ContentValues就行。

ContentValues contentValues = new ContentValues();

contentValues.put("name", "guest");

this.sqLiteDatabase.update("user", contentValues,"id=?", new String[]{"1"});

代碼片段9.3.1.5 更新語句

    註釋:update有四個參數,分別對應爲表明、需要更改的鍵值對、where字段、where字段對應的值

   

    6.  刪除記錄

    刪除的操作也是類似。

this.sqLiteDatabase.delete("user","id=?", new String[]{"1"});

代碼片段9.3.1.6 刪除語句

   

    7.  查詢記錄

    查詢是通過query這個方法來進行,這個方法會返回一個遊標Cursor。

while(cursor.moveToNext()){

String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));

String name =cursor.getString(cursor.getColumnIndex("name"));

}  

代碼片段9.3.1.7 查詢語句

    註釋:上述就是一個簡單的查詢,通過遊標的移動判斷是否存在下一個,之後通過列名查得列號,再根據列號來獲取該次循環所對應的列值。記住,每次查詢完畢都需要關閉cursor,即cursor.close()

   

    一般查詢的參數如下(由左向右):

參數

描述

備註

[String]

執行查詢的表名稱

 

[String Array]

返回的列名稱的列表

可以使用null,表示全部返回

[String]

WHERE子語句

可以使用null,即無條件查詢,用“?”表示查詢參數

[String Array]

查詢參數的值

當查詢子語句爲null時,必須爲null

[String]

GROUP BY子句

null表示無分組

[String]

HAVING子句

當GROUP BY爲null時,必須爲null

[String]

ORDER BY子句

如果爲null,則表示使用默認排序

[String]

LIMIT子句

爲null,則表示無限制

表9.3.1 查詢語句參數表

   

    8.  複雜查詢

   

    注意:對於複雜的查詢,有一下兩種方法,一種是通過SQLiteQueryBuilder類構建複雜查詢;另一種是通過rawQuery執行原生sql語句查詢。相對來說,rawQeruy的查詢比SQLiteQueryBuilder簡單

   

    SQLiteQueryBuilder:

SQLiteQueryBuilder builder = new SQLiteQueryBuilder();

builder.setTables("user, info");

builder.appendWhere("user.info=info.id");

           

String[] returnColumns = {

      "user.id",

      "user.name",

      "info.sex"

   };

String sortOrder = "user.id ASC";

 

Cursor cursor = builder.query(this.sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);

StringBuffer buffer = new StringBuffer();

while(cursor.moveToNext()){

String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));

String name =cursor.getString(cursor.getColumnIndex("name"));

String sex =cursor.getString(cursor.getColumnIndex("sex"));

 

buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+"\r\n");

}

result.setText(buffer);

cursor.close();

代碼片段9.3.1.8 SQLiteQueryBuilder語句

   

註釋:query的參數如下:

參數

描述

備註

[SQLiteDatabase]

數據庫

用來查詢的數據庫實體

[String Array]

返回的列名數組

 

[String]

WHERE 子句

查詢條件

[String Array]

選擇條件對應的值

在條件爲null是,必須爲null

[String]

GROUP BY子句

null表示無分組

[String]

HAVING子句

當GROUP BY爲null時,必須爲null

[String]

SORT ORDER

排序字段

表9.3.2 query的參數表

   

    rawQuery:

public static final String RAW_COMPLEX_QUERY ="SELECTuser.id,user.name,info.sex FROM user,info "

         + "WHEREuser.id=info.id ORDER BY user.id asc";

代碼片段9.3.1.9 原生查詢語句

 

Cursor cursor = this.sqLiteDatabase.rawQuery(SQLStr.RAW_COMPLEX_QUERY,null);

StringBuffer buffer = new StringBuffer();

while(cursor.moveToNext()){

String id =

String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));

String name =cursor.getString(cursor.getColumnIndex("name"));

String sex =cursor.getString(cursor.getColumnIndex("sex"));

 

buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+"\r\n");

}

result.setText(buffer);

cursor.close();

代碼片段9.3.1.10原生SQL調用語句

   

註釋:rawQuery的參數如下:

參數

描述

備註

[String]

SQL語句

 

[String Array]

WHERE ARGS

條件查詢對應的值

表9.3.3 rawQuery參數

   

   

      9.3.2 View中綁定數據

    上述瞭解瞭如何進行數據查詢,現在可以通過Adapter適配器來進行數據的捆綁,讓其在View中展示,而不是如上只是簡單的顯示。

SQLiteQueryBuilder builder = newSQLiteQueryBuilder();

builder.setTables("user, info");

builder.appendWhere("user.info=info.id");

     

String[] returnColumns = {

   "user.id as _id",

   "user.name",

   "info.sex"

};

String sortOrder = "user.id ASC";

     

Cursor cursor = builder.query(sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);

startManagingCursor(cursor);

ListAdapter adapter = newSimpleCursorAdapter(this, R.layout.activity_listitem, cursor,

new String[]{"_id","name","sex"},

new int[]{R.id.item_id,R.id.item_name,R.id.item_sex});

this.listView.setAdapter(adapter);

代碼片段9.3.2.1 view中綁定數據

註釋:基本的查詢在上面已經描述過,在綁定到Adapter適配器的時候,需要注意必須要有一個_id列,如果沒有,可以通過別名將主鍵映射爲_id

 

            案例:

            AndroidStudy_Database


            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章