android安卓 SQLite教程:內部架構及SQLite使用辦法

SQLite 介紹 
SQLite一個很是流行的嵌入式數據庫,它支持SQL語言,而且只利用不多的內存就有很好的性能。因爲JDBC不適合手機這種內存受限設備,因此Android開發人員須要學習新的API 來使用SQLite。此外它仍是開源的,任何人均可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了SQLite. 
SQLite由如下幾個組件組成:SQL編譯器、內核、後端以及附件。SQLite經過利用虛擬機和虛擬數據庫引擎(VDBE),使調試、修改和擴展SQLite的內核變得更加方便。 javascript

 

圖 1. SQLite 內部架構


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 建立數據庫: java

Java代碼    收藏代碼
  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 實例,具體調用那個方法,取決於你是否須要改變數據庫的內容: 程序員

Java代碼    收藏代碼
  1. db=(new DatabaseHelper(getContext())).getWritableDatabase();     
  2. return (db == null) ? false : true;     


上面這段代碼會返回一個 SQLiteDatabase 類的實例,使用這個對象,你就能夠查詢或者修改數據庫。 
當你完成了對數據庫的操做(例如你的 Activity 已經關閉),須要調用 SQLiteDatabase 的 Close() 方法來釋放掉數據庫鏈接。 
建立表和索引 
爲了建立表和索引,須要調用 SQLiteDatabase 的 execSQL() 方法來執行 DDL 語句。若是沒有異常,這個方法沒有返回值。 
例如,你能夠執行以下代碼: sql

Java代碼    收藏代碼
  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 語句。例如: shell

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


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

Java代碼    收藏代碼
  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 相似。例如: 後端

Java代碼    收藏代碼
  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 語句。例如: 架構

Java代碼    收藏代碼
  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 Queries 
query() 方法用 SELECT 語句段構建查詢。SELECT 語句內容做爲 query() 方法的參數,好比:要查詢的表名,要獲取的字段名,WHERE 條件,包含可選的位置參數,去替代 WHERE 條件中位置參數的值,GROUP BY 條件,HAVING 條件。 
除了表名,其餘參數能夠是 null。因此,之前的代碼段能夠可寫成: app

Java代碼    收藏代碼
  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 表 ide

Java代碼    收藏代碼
  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

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

相關文章
相關標籤/搜索