Android學習之基礎知識九 — 數據存儲(持久化技術)之使用LitePal操作數據庫
上一節學習了使用SQLiteDatabase來操作SQLite數據庫的方法,接下來我們開始接觸第一個開源庫:LitePal。LitePal是一款開源的Android數據庫框架,它采用了對象關系映射(ORM)的模式,並將我們平時開發最常用到的一些數據庫功能進行了封裝,使得不用編寫一行SQL語句就可以完成各種建表和增刪改查的操作,LitePal的項目主頁上也有詳細的使用文檔,地址是:
https://github.com/LitePalFramework/LitePal
一、配置LitePal
要在項目中使用開源庫,過去是需要下載開源庫的Jar包或者源碼,然後再集成到我們的項目中,而現在大多數的開源項目都會將版本提交到:jcenter上,我們只需要在:app/build.gradle文件中聲明該開源庫的引用就可以了。
第一步:編輯:app/build.gradle文件,在dependencies閉包中添加如下內容:前面部分是固定的,最後是版本號,最新的版本號可以在LitePal的項目主頁上去查看。
第二步:配置:litepal.xml文件,右擊:app/src/main目錄 ---> New ---> Directory,創建一個assets目錄,然後在assets目錄下再新建一個litepal.xml文件,接著編輯litepal.xml文件中的內容:
<dbname>標簽:用於指定數據庫名
<version>標簽:用於指定數據庫的版本號
<list>標簽:用於指定所有的映射模型
第三步:配置LitePalApplication,修改AndroidManifest.xml中的代碼:
將項目的application配置為:org.litepal.litePalApplication,這樣才能讓LitePal的所有功能都可以正常工作。(後面我們會對application進行詳細的講解)
二、創建和升級數據庫
前面我們創建數據庫是通過自定義一個類繼承SQLiteOpenHelper,然後在onCreate()方法中編寫建表語句來實現的,而使用LitePal就不用這麽麻煩了。我們先將activity_main.xml布局文件(幾個按鈕)從DatabaseTest項目復制到LitePalTest項目中來。
LitePal采取的是對象關系映射(ORM)的模式,什麽是對象關系映射呢?簡單的說,我們使用的編程語言是面向對象語言,而使用的數據庫則是關系型數據庫,那麽將面向對象的語言和面向關系的數據庫之間建立的一種映射關系,就是對象關系映射。它賦予我們強大的功能,就是可以用面向對象的思維來操作數據庫,而不用再和SQL語句打交道了。使用SQLiteDatabase來創建表時,需要先分析表中應該包括哪些列,然後再編寫出一條建表語句,最後在自定義的SQLiteOpenHelper中去執行這條建表語句,但是使用LitePal就不用那麽麻煩了:
第一步:定義一個Book類:
第二步:將Book類添加到映射模型列表中,修改:litepal.xml中的代碼:
<mapping>標簽:聲明我們要配置的映射模型類,註意一定要使用完整的類名,不管有多少模型類需要映射,都使用同樣的方式配置在<list>標簽中即可
第三步:在MainActivity中任意進行一次數據庫的操作,數據庫就能自動創建了
第四步:運行程序,點擊按鈕,查看BookStore數據庫和book表是否創建成功
拓展:
如果我們想要在book表中添加一個press(出版社)列,直接在Book類中再加一個press字段即可;如果我們想要在建一個Category表,就只需要再新建一個Category類,然後將它添加到映射模型列表中就行了。如下所示:
第一步:在Book類中添加press字段:
第二步:新建Category類
第三步:將該表添加到映射模型列表中(註意修改版本號)
第四步:運行程序,查看表列表:
三、LitePal對數據庫進行CRUD操作
3.1、添加數據
首先回顧一下之前添加數據的方法,需要創建一個ContentValues對象,然後將所有要添加的數據put到這個ContentValues對象中,最後調用SQLiteDatabase的:insert()方法將數據添加到數據庫表中。
而使用LitePal來添加數據,就簡單得多了,我們只需要創建出模型類的實例,再通過對應的set方法把數據設置好,最後調用一下:save()方法就可以了。但是這裏需要註意的是:剛剛我們使用LitePal進行表管理操作時模型類沒有繼承其他類,但是進行CRUD操作時就必須要繼承LitePalSupport類才行,因為:save()方法就是來只LitePalSupport類
第一步:將Book類繼承LitePalSupport類
第二步:在MainActivity中向Book表中添加數據
第三步:運行程序,查看Book表中的數據,我們可以看到數據已經添加成功
3.2、更新數據(book.updateAll()方法)
方式一:
第一步:在MainActivity中對更新按鈕進行功能實現。
第二步:運行程序,點擊更新按鈕,查看Book表中的數據
方式二:
第一步:修改MainActivity中的代碼:
第二步:運行程序,點擊更新按鈕,查看Book表中的數據
總結:
1、 方式二比方式一更加簡潔靈巧
2、updateAll()方法可以指定一個條件約束,和SQLiteDatabase中的:update()方法的where參數部分有點類似,但是更加簡潔,如果不指定條件語句的話,就表示更新所有的數據。
3、在使用updateAll()方法時,還有一個非常重要的知識點你需要知曉,就是當你想把一個字段的值更新成默認值時,是不可以使用上面的方式來set數據的。我們知道,在Java中的任何一種數據類型的字段都是會有默認值的,int是0,boolean是false,String是null,當我們new出一個Book對象時,其實所有的字段都已經被初始化成默認值了,如果我們想要把數據庫表中的page列更新成0,直接調用book.setPage(0)是不可以的,因為即使不調用這行代碼,page字段本身也是0,LitePal此時是不會對這個列進更新的,對於所有想要將數據更新成默認值的操作,LitePal統一提供了一個setToDefault()方法,然後傳入相應的列名就可以實現了。比如我們將所有書的頁數都更新為0,代碼如下:
3.3、刪除數據(LitePal.deleteAll()方法)
使用LitePal刪除數據的方式主要有兩種,第一種比較簡單,就是直接調用已存儲對象的delete()方法來刪除數據。這種方式比較簡單,我們就不進行代碼演示了,下面看另外一種刪除數據的方式:
第一步:在MainActivity中添加刪除按鈕的點擊事件:
第二步:運行程序,點擊刪除按鈕,查看Book表中的數據,我們發現也是為800的“The first Code of Android”這本書已經刪除了。
3.4、查詢數據(LitePal.findAll()方法)
第一步:給查詢按鈕添加監聽事件,將查詢到的數據打印出來
第二步:查看打印結果
拓展:
除了:findAll()方法,LitePal還提供了很多其他非常有用的查詢API,如下所示:
我們還可以通過連綴查詢來定制更多的查詢功能:
對於上面的5個方法,還可以進行任意的連綴組合:
關於LitePal的查詢API差不多就介紹到這裏,這些API已經足夠我們應對絕大多數場景的查詢需求了,如果實在有一些特殊需求,上述API滿足不了你的時候,LitePal仍然支持使用原生的SQL來進行查詢:
Android學習之基礎知識九 — 數據存儲(持久化技術)之使用LitePal操作數據庫