[置顶] Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite...
SQLite是一種轉為嵌入式設備設計的輕型數據庫,其只有五種數據類型,分別是:
NULL: 空值
INTEGER: 整數
REAL: 浮點數
TEXT: 字符串
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(): 開始一個事務。
close(): 關閉連接,釋放資源。
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訪問數據庫是一件很方便的事兒。
一、 創建數據庫
通過openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法創建數據庫。
SQLiteDatabase db = this.openOrCreateDatabase("test_db.db", Context.MODE_PRIVATE, null); SQLiteDatabase db2 = SQLiteDatabase.openOrCreateDatabase("/data/data/com.test/databases/test_db2.db3", null);
?
另外還可以通過寫一個繼承SQLiteOpenHelper類的方式創建數據庫,此種方式是一種更加進階的創建方式,所以在此不做描述。
二、創建數據表,插入數據。
Android系統并沒有提供特別的創建數據表的方法,數據表通過SQL語句創建,代碼如下:
?
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。以鍵值對的方式保存數據。
數據插入代碼如下:
?
ContentValues values = new ContentValues();for(int i=0;i<10;i++){values.put("name", "test" + i);db.insert("tab", "_id", values);}
執行此操作后,會新增一個名為“tab”的數據表,利用SQLite客戶端(推薦:SQLite Expert Personal 3)可輕松查看此表結構和數據。如下圖:
三、修改數據
? update(String table, ContentValues values, String whereClause, String[] whereArgs)方法用于修改數據,其四個參數的具體含義如下:
table: 目標表名
values: 要被修改成為的新值
whereClause: where子句,除去where關鍵字剩下的部分,其中可帶?占位符。如沒有子句,則為null。
whereArgs: 用于替代whereClause參數中?占位符的參數。如不需傳入參數,則為null。
數據修改代碼如下:
ContentValues values = new ContentValues();values.put("name", "name");db.update("tab", values, "_id=1", null);db.update("tab", values, "_id=?", new String[]{"5"});
執行結果如下圖,_id=1和_id=5的數據,name字段的值被修改為了“name”。
四、查詢數據。
之前一直使用SQLite客戶端查看數據情況了,這里就使用android提供的query()和rowQuery()方法執行查詢。具體代碼如下:
Cursor c = db.query("tab", null, null, null, null, null, null);c.moveToFirst();while(!c.isAfterLast()){int index = c.getColumnIndex("name");Log.d("SQLite", c.getString(index));c.moveToNext();}c = db.rawQuery("select * from tab", null);c.moveToFirst();while(!c.isAfterLast()){int index = c.getColumnIndex("name");Log.d("SQLite", c.getString(index));c.moveToNext();}
查詢結果如下圖:
????????
可以清晰的在查詢結果中,紅線上下的數據是完全一致的,也就是說query和rawQuery方法在的不同僅僅在于所需參數的不同。rawQuery方法需要開發者手動寫出查詢SQL,而query方法是由目標表名、where子句、order by子句、having子句等諸多子句由系統組成SQL語句。兩方法同返回Cursor對象,所以兩方在使用時孰優孰劣,就看具體情況了。本人更喜歡rawQuery的方式,因為此方式更接近傳統Java開發,也可以由專業DBA來書寫SQL語句,這樣更符合MVC的思想,而且這樣的代碼可讀性更高。(query方法里面參數實在太多,有點記不住誰是order by子句,誰是having子句了)
Cursor對象可以理解為游標對象,凡是對數據有所了解的人,相信對此對象都不會陌生,在這里機不再累述。只提醒一點,在第一次讀取Cursor對象中的數據時,一定要先移動游標,否則此游標的位置在第一條記錄之前,會引發異常。
五、刪除數據
刪除數據也是一件很簡單的事,只需要調用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()方法關閉連接,釋放資源。這個原因相信大家都是懂的。
?
轉載于:https://www.cnblogs.com/anjon520/archive/2013/04/13/3249933.html
總結
以上是生活随笔為你收集整理的[置顶] Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gitorious安装与配置
- 下一篇: 【学习笔记】〖ASP.NET〗连接字符串