Android數據存儲(4):SQLite Database

  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子類的建立

  

  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的詳細內容,請查詢相關文檔或參見後續文章。

 

   未完,待續。  

相關文章
相關標籤/搜索