一、關系型資料庫sqlite
每個應用程式都要使用資料,android應用程式也不例外,android使用開源的、與作業系統無關的sql資料庫—sqlite。sqlite第一個alpha版本誕生于2000年5月,它是一款輕量級資料庫,它的設計目标是嵌入式的,占用資源非常的低,隻需要幾百k的記憶體就夠了。sqlite已經被多種軟體和産品使用,mozilla firefox就是使用sqlite來存儲配置資料的,android和iphone都是使用sqlite來存儲資料的。
sqlite體系結構圖如下:
編譯器包括tokenizer(詞法分析器)、 parser(文法分析器)、code generator(代碼産生器)。他們協同處理文本形式的結構化查詢語句。
後端由b-tree,pager,os interface組成。b-tree的職責是負責排序,維護多個資料庫頁之間錯綜複雜的關系,将頁面組織成樹狀結構,頁面就是樹的葉子。pager負責傳輸,根據b-tree的請求從磁盤讀取頁面或者寫入頁面。
公共服務中有各種實用的功能比如:記憶體配置設定、字元串比較,unicode轉換等。
sqlite資料庫是d.richard hipp用c語言編寫的開源嵌入式資料庫,支援的資料庫大小為2tb。它具有如下特征: 1、輕量級 sqlite和c\s模式的資料庫軟體不同,它是程序内的資料庫引擎,是以不存在資料庫的用戶端和伺服器。使用sqlite一般隻需要帶上它的一個動态庫,就可以享受它的全部功能。而且那個動态庫的尺寸也相當小。 2、獨立性 sqlite資料庫的核心引擎本身不依賴第三方軟體,使用它也不需要“安裝”,是以在使用的時候能夠省去不少麻煩。 3、隔離性 sqlite資料庫中的所有資訊(比如表、視圖、觸發器)都包含在一個檔案内,友善管理和維護。 4、跨平台 sqlite資料庫支援大部分作業系統,除了我們在電腦上使用的作業系統之外,很多手機作業系統同樣可以運作,比如android、windows mobile、symbian、palm等。 5、多語言接口 sqlite資料庫支援很多語言程式設計接口,比如c\c++、java、python、dotnet、ruby、perl等,得到更多開發者的喜愛。 6、安全性 sqlite資料庫通過資料庫級上的獨占性和共享鎖來實作獨立事務處理。這意味着多個程序可以在同一時間從同一資料庫讀取資料,但隻有一個可以寫入資料。在某個程序或線程向資料庫執行寫操作之前,必須獲得獨占鎖定。在發出獨占鎖定後,其他的讀或寫操作将不會再發生。 sqlite官方網站(http://www.sqlite.org),了解更多内容請前往。
二、導出檢視資料庫檔案
在android中,為某個應用程式建立的資料庫,隻有它可以通路,其它應用程式是不能通路的,資料庫位于android裝置/data/data/package_name/databases檔案夾中。
想要将資料庫檔案導出可以使用eclipse,如圖所示:
檢視資料庫,使用sqlite database browser,如圖所示:
三、擴充類
3.1擴充sqliteopenhelper
android 不自動提供資料庫。在 android 應用程式中使用 sqlite,必須自己建立資料庫,然後建立表、索引,填充資料。android 提供了 sqliteopenhelper 幫助你建立一個資料庫,你隻要繼承 sqliteopenhelper 類,就可以輕松的建立資料庫。sqliteopenhelper 類根據開發應用程式的需要,封裝了建立和更新資料庫使用的邏輯。sqliteopenhelper 的子類,至少需要實作三個方法:
構造函數,調用父類 sqliteopenhelper 的構造函數
oncreate()方法;// todo 建立資料庫後,對資料庫的操作
onupgrage()方法。// todo 更改資料庫版本的操作
當你完成了對資料庫的操作(例如你的 activity 已經關閉),需要調用 sqlitedatabase 的 close() 方法來釋放掉資料庫連接配接。
操作資料庫的最佳實踐是建立一個輔助類,例如聯系人子產品
class contactsdatabasehelper extends sqliteopenhelper
3.2 cursor類
android使用cursor類傳回一個需要的值,cursor作為一個指針從資料庫查詢傳回結果集,使用cursor允許android更有效地管理它們需要的行和列,你使用contentvalues對象存儲鍵/值對,它的put()方法允許你插入不同資料類型的鍵值。
3.3 資料類型
sqlite 和其他資料庫最大的不同就是對資料類型的支援,建立一個表時,可以在 create table 語句中指定某列的資料類型,但是你可以把任何資料類型放入任何列中。當某個值插入資料庫時,sqlite 将檢查它的類型。如果該類型與關聯的列不比對,則 sqlite 會嘗試将該值轉換成該列的類型。如果不能轉換,則該值将作為其本身具有的類型存儲。比如可以把一個字元串(string)放入 integer 列。sqlite 稱這為“弱類型”(manifest typing.)。
四、資料庫操作
4.1建立資料庫
android 不自動提供資料庫。在 android 應用程式中使用 sqlite,必須自己建立資料庫,然後建立表、索引,填充資料。android 提供了 sqliteopenhelper 幫助你建立一個資料庫,你隻要繼承 sqliteopenhelper 類,就可以輕松的建立資料庫。sqliteopenhelper 類根據開發應用程式的需要,封裝了建立和更新資料庫使用的邏輯。sqliteopenhelper 的子類,至少需要實作三個方法:
構造函數,調用父類 sqliteopenhelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 activity),資料庫名字,一個可選的遊标工廠(通常是 null),一個代表你正在使用的資料庫模型版本的整數。
oncreate()方法,它需要一個 sqlitedatabase 對象作為參數,根據需要對這個對象填充表和初始化資料。
onupgrage() 方法,它需要三個參數,一個 sqlitedatabase 對象,一個舊的版本号和一個新的版本号,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
下面示例代碼展示了如何繼承 sqliteopenhelper 建立資料庫:
接下來讨論具體如何建立表、插入資料、删除表等等。調用 getreadabledatabase() 或 getwriteabledatabase() 方法,你可以得到 sqlitedatabase 執行個體,具體調用那個方法,取決于你是否需要改變資料庫的内容:
上面這段代碼會傳回一個 sqlitedatabase 類的執行個體,使用這個對象,你就可以查詢或者修改資料庫。
當你完成了對資料庫的操作(例如你的 activity 已經關閉),需要調用 sqlitedatabase 的 close() 方法來釋放掉資料庫連接配接。
4.2建立表和索引
為了建立表和索引,需要調用 sqlitedatabase 的 execsql() 方法來執行 ddl 語句。如果沒有異常,這個方法沒有傳回值。
例如,你可以執行如下代碼:
這條語句會建立一個名為 mytable 的表,表有一個列名為 _id,并且是主鍵,這列的值是會自動增長的整數(例如,當你插入一行時,sqlite 會給這列自動指派),另外還有兩列:title( 字元 ) 和 value( 浮點數 )。 sqlite 會自動為主鍵列建立索引。
通常情況下,第一次建立資料庫時建立了表和索引。如果你不需要改變表的 schema,不需要删除表和索引 . 删除表和索引,需要使用 execsql() 方法調用 drop index 和 drop table 語句。
4.3給表添加資料
上面的代碼,已經建立了資料庫和表,現在需要給表添加資料。有兩種方法可以給表添加資料。
像上面建立表一樣,你可以使用 execsql() 方法執行 insert, update, delete 等語句來更新表的資料。execsql() 方法适用于所有不傳回結果的 sql 語句。例如:
另一種方法是使用 sqlitedatabase 對象的 insert(), update(), delete() 方法。這些方法把 sql 語句的一部分作為參數。示例如下:
update()方法有四個參數,分别是表名,表示列名和值的 contentvalues 對象,可選的 where 條件和可選的填充 where 語句的字元串,這些字元串會替換 where 條件中的“?”标記。update() 根據條件,更新指定列的值,是以用 execsql() 方法可以達到同樣的目的。
where 條件和其參數和用過的其他 sql apis 類似。例如:
delete() 方法的使用和 update() 類似,使用表名,可選的 where 條件和相應的填充 where 條件的字元串。
4.3查詢資料庫
類似 insert, update, delete,有兩種方法使用 select 從 sqlite 資料庫檢索資料。
1 .使用 rawquery() 直接調用 select 語句;
使用 query() 方法建構一個查詢。
raw queries
正如 api 名字,rawquery() 是最簡單的解決方法。通過這個方法你就可以調用 sql select 語句。例如:
在上面例子中,我們查詢 sqlite 系統表(sqlite_master)檢查 table 表是否存在。傳回值是一個 cursor 對象,這個對象的方法可以疊代查詢結果。
如果查詢是動态的,使用這個方法就會非常複雜。例如,當你需要查詢的列在程式編譯的時候不能确定,這時候使用 query() 方法會友善很多。
regular queries
query() 方法用 select 語句段建構查詢。select 語句内容作為 query() 方法的參數,比如:要查詢的表名,要擷取的字段名,where 條件,包含可選的位置參數,去替代 where 條件中位置參數的值,group by 條件,having 條件。
除了表名,其他參數可以是 null。是以,以前的代碼段可以可寫成:
使用遊标
不管你如何執行查詢,都會傳回一個 cursor,這是 android 的 sqlite 資料庫遊标,使用遊标,你可以:
通過使用 getcount() 方法得到結果集中有多少記錄;
通過 movetofirst(), movetonext(), 和 isafterlast() 方法周遊所有記錄;
通過 getcolumnnames() 得到字段名;
通過 getcolumnindex() 轉換成字段号;
通過 getstring(),getint() 等方法得到給定字段目前記錄的值;
通過 requery() 方法重新執行查詢得到遊标;
通過 close() 方法釋放遊标資源;
例如,下面代碼周遊 mytable 表
在 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在運作時內建了sqlite , 是以每個android應用程式都可以使用sqlite資料庫。
資料庫存放的位置:data/<項目檔案夾>/databases/
第一步:建立資料庫
android 中提供sqliteopenhelper類幫助建立一個資料庫,繼承該類可以輕松的建立sqlite資料庫;
注意:sqliteopenhelper的子類至少要實作三個方法:
* 帶參的構造方法;
* oncreate();
* onupgrag();
java代碼如下:
案例代碼如下:
六、結束語
如果你想要開發 android 應用程式,一定需要在 android 上存儲資料,使用 sqlite 資料庫是一種非常好的選擇。