SQLite是一種轉爲嵌入式設備設計的輕型數據庫,其只有五種數據類型,分別是:html
NULL: 空值java
INTEGER: 整數android
REAL: 浮點數web
TEXT: 字符串sql
BLOB: 大數據數據庫
在SQLite中,並無專門設計BOOLEAN和DATE類型,由於BOOLEAN型能夠用INTEGER的0和1代替true和false,而DATE類型則能夠擁有特定格式的TEXT、REAL和INTEGER的值來代替顯示,爲了能方便的操做DATE類型,SQLite提供了一組函數,詳見:http://www.sqlite.org/lang_datefunc.html。這樣簡單的數據類型設計更加符合嵌入式設備的要求。關於SQLite的更多資料,請參看:http://www.sqlite.org/函數
在Android系統中提供了android.database.sqlite包,用於進行SQLite數據庫的增、刪、改、查工做。其主要方法以下:大數據
beginTransaction(): 開始一個事務。this
close(): 關閉鏈接,釋放資源。spa
delete(String table, String whereClause, String[] whereArgs): 根據給定條件,刪除符合條件的記錄。
endTransaction(): 結束一個事務。
execSQL(String sql): 執行給定SQL語句。
insert(String table, String nullColumnHack, ContentValues values): 根據給定條件,插入一條記錄。
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory): 根據給定條件鏈接數據庫,若是此數據庫不存在,則建立。
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy): 執行查詢。
rawQuery(String sql, String[] selectionArgs): 根據給定SQL,執行查詢。
update(String table, ContentValues values, String whereClause, String[] whereArgs): 根據給定條件,修改符合條件的記錄。
除了上訴主要方法外,Android還提供了諸多實用的方法,總之一句話:其實Android訪問數據庫是一件很方便的事兒。
1、 建立數據庫
經過openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法建立數據庫。
1 SQLiteDatabase db =this.openOrCreateDatabase("test_db.db", Context.MODE_PRIVATE, null);
2 SQLiteDatabase db2 = SQLiteDatabase.openOrCreateDatabase("/data/data/com.test/databases/test_db2.db3", null);
如上兩種方式均能建立數據庫,this.openOrCreateDatabase是對SQLiteDatabase.openOrCreateDatabase而來,如代碼所見,原生的SQLiteDatabase.openOrCreateDatabase()方法第一參數要求輸入絕對路勁,而全部的數據庫都是儲存於「data/data/應用報名/databases」目錄下,因此輸入徹底的絕對路勁是一件重複且繁雜的工做。採用this.openOrCreateDatabase則省去了此操做。執行操做後的結果以下圖:
另外還能夠經過寫一個繼承SQLiteOpenHelper類的方式建立數據庫,此種方式是一種更加進階的建立方式,因此在此不作描述。
2、建立數據表,插入數據。
Android系統並無提供特別的建立數據表的方法,數據表經過SQL語句建立,代碼以下:
1 db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");
表建立好以後,經過insert(String table, String nullColumnHack, ContentValues values)方法插入數據,其中參數含義分別爲:
table: 目標表名
nullColumnHack: 指定表中的某列列名。由於在SQLite中,不容許不容許插入全部列均爲null的記錄,所以初始值有值爲空時,此列需顯式賦予null
values: ContentValues對象,相似於java中的Map。以鍵值對的方式保存數據。
數據插入代碼以下:
1 ContentValues values =new ContentValues();
2 for(int i=0;i<10;i++){
3 values.put("name", "test"+ i);
4 db.insert("tab", "_id", values);
5 }
執行此操做後,會新增一個名爲「tab」的數據表,利用SQLite客戶端(推薦:SQLite Expert Personal 3)可輕鬆查看此表結構和數據。以下圖:
3、修改數據
update(String table, ContentValues values, String whereClause, String[] whereArgs)方法用於修改數據,其四個參數的具體含義以下:
table: 目標表名
values: 要被修改爲爲的新值
whereClause: where子句,除去where關鍵字剩下的部分,其中可帶?佔位符。如沒有子句,則爲null。
whereArgs: 用於替代whereClause參數中?佔位符的參數。如不需傳入參數,則爲null。
數據修改代碼以下:
1 ContentValues values =new ContentValues();
2 values.put("name", "name");
3 db.update("tab", values, "_id=1", null);
4 db.update("tab", values, "_id=?", new String[]{"5"});
執行結果以下圖,_id=1和_id=5的數據,name字段的值被修改成了「name」。
4、查詢數據。
以前一直使用SQLite客戶端查看數據狀況了,這裏就使用android提供的query()和rowQuery()方法執行查詢。具體代碼以下:
1 Cursor c = db.query("tab", null, null, null, null, null, null);
2 c.moveToFirst();
3 while(!c.isAfterLast()){
4 int index = c.getColumnIndex("name");
5 Log.d("SQLite", c.getString(index));
6 c.moveToNext();
7 }
8 c = db.rawQuery("select * from tab", null);
9 c.moveToFirst();
10 while(!c.isAfterLast()){
11 int index = c.getColumnIndex("name");
12 Log.d("SQLite", c.getString(index));
13 c.moveToNext();
14 }
查詢結果以下圖:
能夠清晰的在查詢結果中,紅線上下的數據是徹底一致的,也就是說query和rawQuery方法在的不一樣僅僅在於所需參數的不一樣。rawQuery方法須要開發者手動寫出查詢SQL,而query方法是由目標表名、where子句、order by子句、having子句等諸多子句由系統組成SQL語句。兩方法同返回Cursor對象,因此兩方在使用時孰優孰劣,就看具體狀況了。本人更喜歡rawQuery的方式,由於此方式更接近傳統Java開發,也能夠由專業DBA來書寫SQL語句,這樣更符合MVC的思想,並且這樣的代碼可讀性更高。(query方法裏面參數實在太多,有點記不住誰是order by子句,誰是having子句了)
Cursor對象能夠理解爲遊標對象,凡是對數據有所瞭解的人,相信對此對象都不會陌生,在這裏機再也不累述。只提醒一點,在第一次讀取Cursor對象中的數據時,必定要先移動遊標,不然此遊標的位置在第一條記錄以前,會引起異常。
5、刪除數據
刪除數據也是一件很簡單的事,只須要調用delete方法,傳入參數便可,delete(String table, String whereClause, String[] whereArgs)的參數三個參數具體含義以下:
table: 目標表名
whereClause: where子句,除去where關鍵字剩下的部分,其中可帶?佔位符。如沒有子句,則爲null。
whereArgs: 用於替代whereClause參數中?佔位符的參數。如不需傳入參數,則爲null。
具體代碼以下:
db.delete("tab", "_id=? or name=?", new String[]{"8", "name"});
執行結果以下:
其中_id=8和name=‘name’的數據通通被刪除了。
整個數據庫的CRUD操做到此演示完了。最後提醒一點,在操做完數據後,必定要記得調用close()方法關閉鏈接,釋放資源。這個緣由相信你們都是懂的。