在Android 開發中使用 SQLite 數據庫筆記

SQLite 介紹
 
SQLite 一個很是流行的嵌入式數據庫,它支持 SQL 語言,而且只利用不多的內存就有很好的性能。此外它仍是開源的,任何人均可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLite.

 

SQLite 由如下幾個組件組成:SQL 編譯器、內核、後端以及附件。SQLite 經過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展 SQLite 的內核變得更加方便。


圖 1. SQLite 內部結構
<IGNORE_JS_OP>javascript

 

SQLite 基本上符合 SQL-92 標準,和其餘的主要 SQL 數據庫沒什麼區別。它的優勢就是高效,Android 運行時環境包含了完整的 SQLite。

 

SQLite 和其餘數據庫最大的不一樣就是對數據類型的支持,建立一個表時,能夠在 CREATE TABLE 語句中指定某列的數據類型,可是你能夠把任何數據類型放入任何列中。當某個值插入數據庫時,SQLite 將檢查它的類型。若是該類型與關聯的列不匹配,則 SQLite 會嘗試將該值轉換成該列的類型。若是不能轉換,則該值將做爲其自己具備的類型存儲。好比能夠把一個字符串(String)放入 INTEGER 列。SQLite 稱這爲「弱類型」(manifest typing.)。

 

此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。

 

除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。

 




Android 集成了 SQLite 數據庫
Android 在運行時(run-time)集成了 SQLite,因此每一個 Android 應用程序均可以使用 SQLite 數據庫。對於熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 至關簡單。可是,因爲 JDBC 會消耗太多的系統資源,因此 JDBC 對於手機這種內存受限設備來講並不合適。所以,Android 提供了一些新的 API 來使用 SQLite 數據庫,Android 開發中,程序員須要學使用這些 API。
數據庫存儲在 data/< 項目文件夾 >/databases/ 下。






Android 開發中使用 SQLite 數據庫
Activites 能夠經過 Content Provider 或者 Service 訪問一個數據庫。下面會詳細講解若是建立數據庫,添加數據和查詢數據庫。

 

建立數據庫
Android 不自動提供數據庫。在 Android 應用程序中使用 SQLite,必須本身建立數據庫,而後建立表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你建立一個數據庫,你只要繼承 SQLiteOpenHelper 類,就能夠輕鬆的建立數據庫。SQLiteOpenHelper 類根據開發應用程序的須要,封裝了建立和更新數據庫使用的邏輯。SQLiteOpenHelper 的子類,至少須要實現三個方法:
  • 構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法須要四個參數:上下文環境(例如,一個 Activity),數據庫名字,一個可選的遊標工廠(一般是 Null),一個表明你正在使用的數據庫模型版本的整數。
  • onCreate()方法,它須要一個 SQLiteDatabase 對象做爲參數,根據須要對這個對象填充表和初始化數據。
  • onUpgrage() 方法,它須要三個參數,一個 SQLiteDatabase 對象,一箇舊的版本號和一個新的版本號,這樣你就能夠清楚如何把一個數據庫從舊的模型轉變到新的模型。
下面示例代碼展現瞭如何繼承 SQLiteOpenHelper 建立數據庫:

 

  1. public class DatabaseHelper extends SQLiteOpenHelper {     
  2.   DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
  3.   {     
  4.     super(context, name, cursorFactory, version);     
  5.      }     
  6.      
  7.      @Override   
  8.      public void onCreate(SQLiteDatabase db) {     
  9.          // TODO 建立數據庫後,對數據庫的操做     
  10.      }     
  11.      
  12.      @Override   
  13. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     
  14.          // TODO 更改數據庫版本的操做     
  15.      }     
  16.      
  17. @Override   
  18. public void onOpen(SQLiteDatabase db) {     
  19.          super.onOpen(db);      
  20.          // TODO 每次成功打開數據庫後首先被執行     
  21.      }     
  22. }     
複製代碼


接下來討論具體如何建立表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你能夠獲得 SQLiteDatabase 實例,具體調用那個方法,取決於你是否須要改變數據庫的內容:sql

  1. db=(new DatabaseHelper(getContext())).getWritableDatabase();
  2. return (db == null) ? false : true;
複製代碼
上面這段代碼會返回一個 SQLiteDatabase 類的實例,使用這個對象,你就能夠查詢或者修改數據庫。
當你完成了對數據庫的操做(例如你的 Activity 已經關閉),須要調用 SQLiteDatabase 的 Close() 方法來釋放掉數據庫鏈接。

 

建立表和索引
爲了建立表和索引,須要調用 SQLiteDatabase 的 execSQL() 方法來執行 DDL 語句。若是沒有異常,這個方法沒有返回值。
例如,你能夠執行以下代碼:

 

  1. db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY   
  2.         AUTOINCREMENT, title TEXT, value REAL);");
複製代碼

 

這條語句會建立一個名爲 mytable 的表,表有一個列名爲 _id,而且是主鍵,這列的值是會自動增加的整數(例如,當你插入一行時,SQLite 會給這列自動賦值),另外還有兩列:title( 字符 ) 和 value( 浮點數 )。 SQLite 會自動爲主鍵列建立索引。
一般狀況下,第一次建立數據庫時建立了表和索引。若是你不須要改變表的 schema,不須要刪除表和索引 . 刪除表和索引,須要使用 execSQL() 方法調用 DROP INDEX 和 DROP TABLE 語句。

 

給表添加數據
上面的代碼,已經建立了數據庫和表,如今須要給表添加數據。有兩種方法能夠給表添加數據。
像上面建立表同樣,你可使用 execSQL() 方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL() 方法適用於全部不返回結果的 SQL 語句。例如:

 

  1. db.execSQL("INSERT INTO widgets (name, inventory)"+
  2. "VALUES ('Sprocket', 5)");
複製代碼


另外一種方法是使用 SQLiteDatabase 對象的 insert(), update(), delete() 方法。這些方法把 SQL 語句的一部分做爲參數。示例以下:shell

  1. ContentValues cv=new ContentValues();
  2. cv.put(Constants.TITLE, "example title");
  3. cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
  4. db.insert("mytable", getNullColumnHack(), cv);
複製代碼
update()方法有四個參數,分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 條件和可選的填充 WHERE 語句的字符串,這些字符串會替換 WHERE 條件中的「?」標記。update() 根據條件,更新指定列的值,因此用 execSQL() 方法能夠達到一樣的目的。
WHERE 條件和其參數和用過的其餘 SQL APIs 相似。例如:

 

  1. String[] parms=new String[] {"this is a string"};
  2. db.update("widgets", replacements, "name=?", parms);
複製代碼

 

delete() 方法的使用和 update() 相似,使用表名,可選的 WHERE 條件和相應的填充 WHERE 條件的字符串。
查詢數據庫
相似 INSERT, UPDATE, DELETE,有兩種方法使用 SELECT 從 SQLite 數據庫檢索數據。
1 .使用 rawQuery() 直接調用 SELECT 語句;
使用 query() 方法構建一個查詢。

 

  • Raw Queries正如 API 名字,rawQuery() 是最簡單的解決方法。經過這個方法你就能夠調用 SQL SELECT 語句。例如:
    1. Cursor c=db.rawQuery(
    2.      "SELECT name FROM sqlite_master WHERE type='table' AND name='mytable'", null);
    複製代碼

     
     

    在上面例子中,咱們查詢 SQLite 系統表(sqlite_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的方法能夠迭代查詢結果。若是查詢是動態的,使用這個方法就會很是複雜。例如,當你須要查詢的列在程序編譯的時候不能肯定,這時候使用 query() 方法會方便不少。

 

  • Regular Queriesquery() 方法用 SELECT 語句段構建查詢。SELECT 語句內容做爲 query() 方法的參數,好比:要查詢的表名,要獲取的字段名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。除了表名,其餘參數能夠是 null。因此,之前的代碼段能夠可寫成:
    1. String[] columns={"ID", "inventory"};
    2. String[] parms={"snicklefritz"};
    3. Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null);
    複製代碼

使用遊標無論你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 數據庫遊標,使用遊標,你能夠:經過使用 getCount() 方法獲得結果集中有多少記錄;經過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷全部記錄;經過 getColumnNames() 獲得字段名;經過 getColumnIndex() 轉換成字段號;經過 getString(),getInt() 等方法獲得給定字段當前記錄的值;經過 requery() 方法從新執行查詢獲得遊標;經過 close() 方法釋放遊標資源;例如,下面代碼遍歷 mytable 表數據庫

  1. Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");
  2.     result.moveToFirst();
  3.     while (!result.isAfterLast()) {
  4.         int id=result.getInt(0);
  5.         String name=result.getString(1);
  6.         int inventory=result.getInt(2);
  7.         // do something useful with these
  8.         result.moveToNext();
  9.       }
  10.       result.close();
複製代碼


在 Android 中使用 SQLite 數據庫管理工具
在其餘數據庫上做開發,通常都使用工具來檢查和處理數據庫的內容,而不是僅僅使用數據庫的 API。使用 Android 模擬器,有兩種可供選擇的方法來管理數據庫。首先,模擬器綁定了 sqlite3 控制檯程序,可使用 adb shell 命令來調用他。只要你進入了模擬器的 shell,在數據庫的路徑執行 sqlite3 命令就能夠了。數據庫文件通常存放
在:/data/data/your.app.package/databases/your-db-name若是你喜歡使用更友好的工具,你能夠把數據庫拷貝到你的開發機上,使用 SQLite-aware 客戶端來操做它。這樣的話,你在一個數據庫的拷貝上操做,若是你想要你的修改能反映到設備上,你須要把數據庫備份回去。把數據庫從設備上考出來,你可使用 adb pull 命令(或者在 IDE 上作相應操做)。存儲一個修改過的數據庫到設備上,使用 adb push 命令。一個最方便的 SQLite 客戶端是 FireFox SQLite Manager 擴展,它能夠跨全部平臺使用。
圖 2. SQLite Manager
<IGNORE_JS_OP>後端







結束語

 

若是你想要開發 Android 應用程序,必定須要在 Android 上存儲數據,使用 SQLite 數據庫是一種很是好的選擇。本文介紹瞭如何在 Android 應用程序中使用 SQLite 數據庫 ,主要介紹了在 Android 應用程序中使用 SQLite 建立數據庫和表、添加數據、更新和檢索數據,還介紹了比較經常使用的 SQLite 管理工具,經過閱讀本文,你能夠在 Android 中輕鬆操做 SQLite 數據庫。

 



關於做者謝亞力,在 IBM Lotus 團隊從事 Quickr Webservice API 的測試 , 對 Lotus Quickr Feed API 有豐富的經驗。對軟件測試與開發和 Web 2.0 相關技術有濃厚興趣。

相關文章
相關標籤/搜索