Android系統存儲數據的第四種方式是SQLite Database,即數據庫存儲。數據庫
該方式(數據庫存儲)的特色是存儲私有數據,且數據是具備數據結構的,存儲位置/data/data/<包名>/databases目錄下。數組
數據庫存儲有兩個核心類:數據結構
SQLiteOpenHelper類: 數據庫管理類ide
SQLiteDatabase類: 數據庫操做類this
SQLiteOpenHelper查閱官方文檔知:spa
從上可知:SQLiteOpenHelper是一個幫助類,用來管理數據庫的建立和數據庫的版本,通常定義它的子類,實現它的兩個方法onCreate,onUpdate。code
eg:對象
1 public class DBHelper extends SQLiteOpenHelper { 2 3 public DBHelper(Context context) 4 { 5 //第一個參數是Context對象 6 //第二個參數是數據庫的名字 7 //第三個參數是管理遊標的工廠類對象 8 //第四個參數是當前數據庫的版本 9 super(context, "user.db", null, 1); 10 } 11 12 //建立數據庫時執行該方法 13 //表中字段必須含有一個 _id 14 @Override 15 public void onCreate(SQLiteDatabase db) { 16 17 db.execSQL("create table t_user(_id integer primary key,name text,age int,tel text)"); 18 19 } 20 21 //數據庫版本升級時執行該方法 22 @Override 23 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 24 25 if(newVersion>oldVersion) 26 { 27 db.execSQL("drop table if exists t_user"); 28 } 29 } 30 31 }
SQLiteOpenHelper類的構造方法:blog
這裏咱們通常使用第一個有四個參數的構造方法,其參數含有分別爲:文檔
Context context: context對象
String name: 建立的數據庫名字
SQLiteDatabase.CursorFactory factory: 管理數據庫中游標的工廠類對象,通常設爲null
int version: 數據庫的版本號,用於數據庫版本的升級或降級
SQLiteOpenHelper類的公共方法:
其中咱們較長使用的是:
getReadableDatabase(); 獲取一個可讀(不包含可寫)的數據庫對象,返回的是一個SQLiteDatabase對象
getWriteableDatabase(); 獲取一個可寫(包含可讀)的數據庫對象,返回的是一個SQLiteDatabase對象
SQLiteDatabase查閱官方文檔知:
根據以上可知SQLiteDatabase是一個實際操做數據庫的類,可執行數據庫的增刪改查操做。
獲取SQLiteData對象,咱們通常使用上面所介紹的方法:getReadableDatabase()和getWriteableDatabase()。此外咱們也可使用SQLiteDatabase的靜態方法打開一個指定的數據庫。
使用SQLiteDatabase的靜態方法打開數據庫:
eg:
1 // 被操做的數據庫文件的路徑 2 public static final String DB_PATH = Environment 3 .getExternalStorageDirectory() + "/cache/db/gp.db"; 4 5 SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
註釋:這裏打開的數據庫文件位於手機的擴展卡上,此處咱們也能夠知道數據庫存儲位置也能夠位於擴展卡,SQLiteDatabase能夠操做擴展卡上的數據庫文件。
SQLiteDatabase經常使用操做:
數據庫存儲的操做中,最重要的是查詢操做,對於數據庫的查詢,會返回一個Cursor對象,經過Cursor對象,咱們能夠獲取查詢的結果。
Cursor即遊標,是一個與數據庫操做緊密相關的類,查閱官方文檔知:
Cursor的經常使用方法:
moveToNext();
getColumnCount();
getColumnNames(); 返回一個字符串數組
getColumnName();
getColumnIndex();
getString(),getInt(),...
設想這樣一種情景:經過數據庫查詢,獲取結果,而後在界面ListView中顯示出來。顯然咱們是經過適配器來適配數據,對於Cursor的使用有以下兩種方式:
方式一:可使用通常的適配器,從Cursor中獲取數據,初始化數據源。
1 private void initListView(){ 2 ListView listView = (ListView) findViewById(R.id.listView); 3 4 List<Map<String,Object>> data = new ArrayList<Map<String,Object>>(); 5 6 SQLiteDatabase db = dbHelper.getReadableDatabase(); 7 Cursor cursor = db.rawQuery("select * from t_user",null); 8 while(cursor.moveToNext()){ 9 Map<String,Object> map = new HashMap<String,Object>(); 10 map.put("_id",cursor.getInt(cursor.getColumnIndex("_id"))); 11 map.put("name",cursor.getString(cursor.getColumnIndex("name"))); 12 map.put("age",cursor.getInt(cursor.getColumnIndex("age"))); 13 map.put("tel",cursor.getInt(cursor.getColumnIndex("tel"))); 14 data.add(map); 15 } 16 17 SimpleAdapter adapter = 18 new SimpleAdapter(this,data,R.layout.item_user, 19 new String[]{"_id","name","age","tel"}, 20 new int[]{R.id.text_id,R.id.text_name,R.id.text_age,R.id.text_tel}); 21 22 listView.setAdapter(adapter); 23 }
註釋:這裏dbHelper是一個DatabaseOpenHelper子類的對象,已經提早建立,該處使用的是SimpleAdapter適配器。
方式二:使用與Cursor相對應的適配器SimpleCursorAdapter。
1 private void initListView(){ 2 String[] columns={"_id","name","age","tel"}; 3 int[] to ={R.id.text_id,R.id.text_name,R.id.text_age,R.id.text_tel}; 4 5 ListView listView = (ListView) findViewById(R.id.listView); 6 Cursor cursor = null; 7 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item_user,cursor, 8 columns, 9 to, 10 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 11 12 listView.setAdapter(adapter); 13 14 15 //加載數據 16 SQLiteDatabase db = dbHelper.getReadableDatabase(); 17 cursor = db.query("t_user", columns, null, null, null, null, null); 18 19 //遊標中的數據變化了,須要切換適配器的數據源 20 adapter.swapCursor(cursor); 21 22 }
這裏將相應的代碼分別所有集中於同一個方法,看起來有些繁瑣,固然使用的時候能夠從實際狀況出發,以上僅爲了做爲例子的方便使用才這麼作。
對比這兩種方式,可知:對於數據庫的操做,更多的時候會返回一個Cursor對象,當咱們爲了在AdapterView中顯示數據庫中的數據,咱們可使用SimpleCursorAdapter這個類,它能夠將AdapterView和Cursor(數據源)直接溝通起來.
補上數據庫添加數據的部分:
1 private void initData() { 2 SQLiteDatabase db = dbHelper.getWritableDatabase(); 3 4 ContentValues values = null; 5 6 for(int i=0;i<20;i++){ 7 values = new ContentValues(); 8 values.put("_id", i); 9 values.put("name", "Tom "+ i); 10 values.put("age", 18 + i); 11 values.put("tel","2323"+i); 12 13 db.insert("t_user", null, values); 14 } 15 db.close(); 16 }
數據庫文件位置:
採用兩種方式呈現的結果相同:
關於Cursor和SimpleCursorAdapter的詳細內容,請查詢相關文檔或參見後續文章。
未完,待續。