android之儲存篇_SQLite儲存方式

來源:互聯網
上載者:User

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);

 如上兩種方式均能建立資料庫,this.openOrCreateDatabase是對SQLiteDatabase.openOrCreateDatabase而來,如代碼所見,原生的SQLiteDatabase.openOrCreateDatabase()方法第一參數要求輸入絕對路勁,而所有的資料庫都是儲存於“data/data/應用程式套件名/databases”目錄下,所以輸入完全的絕對路勁是一件重複且繁雜的工作。採用this.openOrCreateDatabase則省去了此操作。執行操作後的結果如:  

另外還可以通過寫一個繼承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,

                                        如果看不懂,請看這裡http://blog.csdn.net/jason0539/article/details/9977175

    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’的資料統統被刪除了。

  整個資料庫的增刪改查操作到此示範完了。最後提醒一點,在操作完資料後,一定要記得調用close()方法關閉串連,釋放資源。這個原因相信大家都是懂的。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.