Android資料存放區(三)——SQLite

來源:互聯網
上載者:User

如果需要一個更加健壯的資料存放區機制,則需要使用一個關係型資料庫,在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

            

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.