Android資料庫高手祕籍(2):建立表和LitePal的基本用法

發表於2015-09-04

上一篇文章中我們學習了一些Android資料庫相關的基礎知識,和幾個頗為有用的SQLite命令,都是直接在命令列操作的。但是我們都知道,資料庫是要和程式結合在一起使用的,單獨對一個資料庫去進行増刪改查操作並沒有什麼意義,因此今天我們就來學習一下如何在Android程式當中去操作SQLite資料庫,還沒看過前一篇文章的朋友可以先去參考 Android資料庫高手祕籍(1):SQLite命令 。

運算元據庫的第一步當然是建立表了,傳統建立表的方法相信大多數人都知道,那麼今天我除了會展示傳統的建表方法之外,還會講解LitePal這個框架的基本用法,並使用它來完成同樣的建表操作,讓大家體會到使用框架來運算元據庫的魅力。

那麼先來簡單介紹一下吧,LitePal是一款開源的Android資料庫框架,它採用了物件關係對映(ORM)的模式,並將我們平時開發時最常用到的一些資料庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表、増刪改查的操作。並且LitePal很“輕”,jar包只有100k不到,而且近乎零配置,這一點和Hibernate這類的框架有很大區別。目前LitePal的原始碼已經託管到了GitHub上,地址是 https://github.com/LitePalFramework/LitePal 。

OK,簡單介紹完了LitePal,我們還是先來看一下,在傳統的Android開發中,需要怎麼去建立表。

傳統的建表方式

其實為了方便我們對資料庫表進行管理,Android本身就提供了一個幫助類:SQLiteOpenHelper。這個類集建立和升級資料庫於一身,並且自動管理了資料庫版本,算是一個非常好用的工具。

那我們現在就來試試SQLiteOpenHelper的用法吧。首先你要知道SQLiteOpenHelper是一個抽象類,這意味著如果我們想要使用它的話,就需要建立一個自己的幫助類去繼承它。SQLiteOpenHelper中有兩個抽象方法,分別是onCreate()和onUpgrade(),我們必須在自己的幫助類裡面重寫這兩個方法,然後分別在這兩個方法中去實現建立、升級資料庫的邏輯。本篇文章只需要把注意力放在建立資料庫這裡就行了,升級資料庫我們會在下一篇文章中去討論。

新建一個MySQLiteHelper類並讓它繼承SQLiteOpenHelper,這樣一個最基本的資料庫幫助類的程式碼如下所示:

其中,當資料庫建立的時候會呼叫onCreate()方法,在這裡去執行建表操作就可以了。比如說我們想新建一張news表,其中有title,content,publishdate,commentcount這幾列,分別代表著新聞標題、新聞內容、釋出時間和評論數,那麼程式碼就可以這樣寫:

可以看到,我們把建表語句定義成了一個常量,然後在onCreate()方法中去執行了這條建表語句,news表也就建立成功了。這條建表語句雖然簡單,但是裡面還是包含了一些小的細節,我來解釋一下。首先,根據資料庫的正規化要求,任何一張表都應該是有主鍵的,所以這裡我們新增了一個自增長的id列,並把它設為主鍵。然後title列和content列都是字串型別的,commentcount列是整型的,這都很好理解,但是publishdate列該怎麼設計呢?由於SQLite中並不支援儲存日期這種資料型別,因此我們需要將日期先轉換成UTC時間(自1970年1月1號零點)的毫秒數,然後再儲存到資料庫中,因此publishdate列也應該是整型的。

現在,我們只需要獲取到SQLiteDatabase的例項,資料庫表就會自動建立了,如下所示:

感覺很簡單很方便是嗎?那你就太容易滿足了,下面我們就來學習一下LitePal的基本用法,看一看使用這個框架是如何實現同樣的功能的。

LitePal的基本用法

雖說LitePal宣稱是近乎零配置,但也只是“近乎”而已,它還是需要進行一些簡單配置才可以使用的,那麼我們第一步就先快速學習一下LitePal的配置方法。

快速配置

1. 引入Jar包或原始碼

首先我們需要將LitePal的jar包引入到專案當中,可以點選這裡檢視LitePal的最新版本,選擇你需要的下載即可。下載好了jar包之後,把它複製到專案的libs目錄中就算是引入成功了,如下圖所示:

20140906183950781

如果你不想用jar包的話,也可以把LitePal的原始碼下載下來,然後作為一個library庫匯入到Eclipse當中,再讓我們的專案去引用這個library庫就可以了。

2. 配置litepal.xml

接著在專案的assets目錄下面新建一個litepal.xml檔案,並將以下程式碼拷貝進去:

配置檔案相當簡單,<dbname>用於設定資料庫的名字,<version>用於設定資料庫的版本號,<list>用於設定所有的對映模型,我們稍後就會用到。

3. 配置LitePalApplication

由於運算元據庫時需要用到Context,而我們顯然不希望在每個介面中都去傳一遍這個引數,那樣運算元據庫就顯得太繁瑣了。因此,LitePal使用了一個方法來簡化掉Context這個引數,只需要在AndroidManifest.xml中配置一下LitePalApplication,所有的資料庫操作就都不用再傳Context了,如下所示:

當然,有些程式可能會有自己的Application,並在這裡配置過了。比如說有一個MyApplication,如下所示:

沒有關係,這時只需要修改一下MyApplication的繼承結構,讓它不要直接繼承Application類,而是繼承LitePalApplication類,就可以使用一切都能正常工作了,程式碼如下所示:

但是,有些程式可能會遇到一些更加極端的情況,比如說MyApplication需要繼承另外一個AnotherApplication,並且這個AnotherApplication還是在jar包當中的,不能修改它的程式碼。這種情況應該算是比較少見了,但是如果你遇到了的話也不用急,仍然是有解釋方案的。你可以把LitePal的原始碼下載下來,然後把src目錄下的所有程式碼直接拷貝到你專案的src目錄下面,接著開啟LitePalApplication類,將它的繼承結構改成繼承自AnotherApplication,再讓MyApplication繼承自LitePalApplication,這樣所有的Application就都可以在一起正常工作了。

僅僅三步,我們就將所有的配置工作全部完成了,並且這是一件一本萬利的事情,自此以後,你就可以開心地體驗LitePal提供的各種便利了,就讓我們從建表開始吧。

開始建表

前面在介紹的時候已經說了,LitePal採取的是物件關係對映(ORM)的模式,那麼什麼是物件關係對映呢?簡單點說,我們使用的程式語言是面嚮物件語言,而我們使用的資料庫則是關係型資料庫,那麼將物件導向的語言和麵向關係的資料庫之間建立一種對映關係,這就是物件關係對映了。

但是我們為什麼要使用物件關係對映模式呢?這主要是因為大多數的程式設計師都很擅長物件導向程式設計,但其中只有少部分的人才比較精通關係型資料庫。而且資料庫的SQL語言晦澀難懂,就算你很精通它,恐怕也不喜歡經常在程式碼中去寫它吧?而物件關係對映模式則很好地解決了這個問題,它允許我們使用物件導向的方式來運算元據庫,從而可以從晦澀難懂的SQL語言中解脫出來。

那麼接下來我們就看一看LitePal中是如何建表的吧。根據物件關係對映模式的理念,每一張表都應該對應一個模型(Model),也就是說,如果我們想要建一張news表,就應該有一個對應的News模型類。新建一個News類,如下所示:

然後,表中的每一列其實就是對應了模型類中的一個欄位,比如news表中有id、title、content、publishdate、commentcount這幾個列,那麼在News類中就也應該有這幾個欄位,程式碼如下所示:

其中id這個欄位可寫可不寫,因為即使不寫這個欄位,LitePal也會在表中自動生成一個id列,畢竟每張表都一定要有主鍵的嘛。

這裡我要特別說明一下,LitePal的對映規則是非常輕量級的,不像一些其它的資料庫框架,需要為每個模型類單獨配置一個對映關係的XML,LitePal的所有對映都是自動完成的。根據LitePal的資料型別支援,可以進行物件關係對映的資料型別一共有8種,int、short、long、float、double、boolean、String和Date。只要是宣告成這8種資料型別的欄位都會被自動對映到資料庫表中,並不需要進行任何額外的配置。

那麼有的朋友可能會問了,既然是自動對映的話,如果News類中有一個字串欄位我並不想讓它對映到資料庫表中,這該怎麼辦呢?對此,LitePal同樣採用了一種極為輕量的解決方案,只有宣告成private修飾符的欄位才會被對映到資料庫表中,如果你有某一個欄位不想對映的話,只需要將它改成public、protected或default修飾符就可以了。

現在模型類已經建好了,我們還差最後一步,就是將它配置到對映列表當中。編輯assets目錄下的litepal.xml檔案,在<list>標籤中加入News模型類的宣告:

注意這裡一定要填入News類的完整類名。

OK,這樣所有的工作就都已經完成了,現在只要你對資料庫有任何的操作,news表就會被自動建立出來。比如說LitePal提供了一個便捷的方法來獲取到SQLiteDatabase的例項,如下所示:

呼叫一下上述程式碼,news表就應該已經建立成功了。我們使用在上一篇文章中學到的SQLite命令來檢視一下,開啟demo.db資料庫,輸入.table命令,結果如下圖所示:

20140907222357271

可以看到,news表已經存在了。另外兩張android_metadata和table_schema表是自動生成的,我們不用理。接下來我們還可以再查詢一下news表的建表語句,如下圖所示:

20140907222630369

這就是LitePal根據News類中的欄位自動幫我們生成的建表語句,由此也說明,建表操作已經成功完成了。

好了,到目前為止你已經算是對LitePal的用法有點入門了,那麼本篇文章的內容就到這裡,下篇文章當中我們將學習使用LitePal進行升級表的操作。感興趣的朋友請繼續閱讀 Android資料庫高手祕籍(三)——使用LitePal升級表 。

相關文章