Android數據庫高手祕籍(九),趕快使用LitePal 2.0版本吧

轉載請註明出處:https://blog.csdn.net/guolin_blog/article/details/80586028

本文同步發表於我的微信公衆號,掃一掃文章底部的二維碼或在微信搜索 郭霖 即可關注,每個工作日都有文章更新。

今天很高興告訴大家一個好消息,LitePal又出新版本了。

算了一下,上個版本1.6.1已經是半年前推出的了,而整個開源項目自2014年推出以來,我已經維護了有四年之久。這四年以來,我不斷地完善着LitePal的代碼,修復各種大家提出的bug,以及補充各式各樣好用的新功能。而今天,時隔半年,LitePal終於迎來了一次大的版本更新,正式發佈了2.0.0版本!

從1.6.1直接跨越到2.0.0,說明這次的升級變化還是非常大的。在2.0.0版本當中,我重構了內部大量的代碼,使得LitePal整體的架構更加合理和清晰,API接口更加科學,並且重寫了數據庫的同步處理機制,解決了很多併發操作數據庫的問題。最重要的是,LitePal 2.0.0版本現在全面支持Kotlin了!以後不管你是用Java還是Kotlin開發Android程序,都可以100%兼容地使用LitePal,是不是有點小激動呢?那麼下面我們就來具體學習一下如何使用新版本的LitePal吧。

升級到2.0.0

升級的方式很簡單,如果你使用的是Android Studio,只需要在build.gradle中修改一下配置即可:

dependencies {
    implementation 'org.litepal.android:core:2.0.0'
}

如果你使用的還是Eclipse,那麼可以點擊 這裏 下載最新版的jar包。

新版本變化

需要大家注意的是,2.0.0版本中幾乎所有的API接口全部都變了。但是請不要驚慌,2.0.0版本是完全向下兼容的,也就是說,大家不用擔心升級之後會出現大量的錯誤,之前所有的代碼都還是可以正常運行的,只是原來舊的API會被標識爲廢棄,提醒大家儘快使用新的API而已,如下圖所示:

![](https://img-blog.csdn.net/20180606095112168)

當然,大家也不用一聽到所有的API都變了就覺得恐慌,其實一切的變更都是有規律可循的。

那麼我們都知道,LitePal本身的用法就非常簡單,因此升級新API的過程也同樣是非常簡單的,下面我們一步步來看。

首先是實體類的繼承要進行修改,這是我們過去的寫法:

![](https://img-blog.csdn.net/20180606100820693)

可以看到,現在DataSupport類已經被標爲了廢棄,雖然暫時還可以正常工作,但是不建議再繼續使用了,從LitePal 2.0.0版本開始建議使用LitePalSupport類,我們將代碼改成如下所示即可:

![](https://img-blog.csdn.net/20180606101801174)

將實體類的繼承結構更改爲LitePalSupport之後,得到的一個隱形好處就是所有的實例CRUD方法都會自動升級到2.0.0版本了,如save()方法,update()方法,delete()方法等等。因此,我們原來存儲一條數據該怎麼寫,現在就還怎麼寫,比如:

Song song = new Song();
song.setName("hello");
song.setDuration("180");
song.save();

這樣就可以存儲一條數據到數據庫當中了,和之前的寫法沒有任何變化,但是卻使用了LitePal 2.0.0中的最新接口了,因爲這個save()方法是來自於LitePalSupport類的。

接下來第二步需要升級的是靜態CRUD方法。原來所有的靜態CRUD方法都是封裝在DataSupport類當中的,比如剛纔我們演示過的查詢數據庫的中數據可以這麼寫:

![](https://img-blog.csdn.net/20180606095112168)

而現在,所有的靜態CRUD方法都被移動到了LitePal類當中,因此我們只需要將DataSupport修改爲LitePal即可,其他的用法都是完全不變的,如下所示:

![](https://img-blog.csdn.net/20180606110913714)

沒錯,升級過程就是這麼簡單。總結一下其實主要就只有兩點,如果你是在繼承結構中使用了DataSupport,那麼就將它改爲LitePalSupport,如果你是調用了DataSupport中的靜態方法,那麼就將它改爲LitePal。

不過最後還有一件事需要注意,如果你的項目代碼啓用了混淆,那麼混淆的配置也需要進行相應的修改纔行,原來的混淆配置如下所示:

-keep class org.litepal.** {
    *;
}

-keep class * extends org.litepal.crud.DataSupport {
    *;
}

而由於DataSupport類已經被廢棄了,因此這裏也需要將混淆文件中的DataSupport改成LitePalSupport纔行,如下所示:

-keep class org.litepal.** {
    *;
}

-keep class * extends org.litepal.crud.LitePalSupport{
    *;
}

將以上的操作都完成之後,那麼恭喜你,你的代碼已經完全升級到LitePal 2.0.0版本了。


在Kotlin中使用LitePal

Kotlin自去年Google IO大會成爲Android一級語言之後,經過了一年多的發展,如今已經正式成爲Google心中的親兒子了。未來使用Kotlin編寫Android程序的人會越來越多,因此LitePal也及時跟進,全面支持了Kotlin語言。

下面我來給大家簡單演示下如何在Kotlin代碼中使用LitePal吧。

首先要定義一個實體類,這裏我們就以Book類爲例吧。比如Book類中有id、name、page這三個字段,並且繼承自LitePalSupport類,如下所示:

class Book(val name: String, val page: Int) : LitePalSupport() {
    val id: Long = 0
}

可以看到,Kotlin中定義實體類真的是非常簡單。需要注意的是,如果你的實體類中需要定義id這個字段,不要把它放到構造函數當中,因爲id的值是由LitePal自動賦值的,而不應該由用戶來指定。因此這裏我們在Book類的內部聲明瞭一個只讀類型的id。

然後需要在litepal.xml中聲明一下這個實體類,這個屬於常規操作了:

<list>
    <mapping class="org.litepal.litepalsample.model.Book" />
</list>

好了!接下來我們就可以進行CRUD操作了,那麼由於是首次使用Kotlin來操作LitePal,這裏我會將每一個操作都分別演示一下。首先是存儲操作,代碼如下所示:

val book = Book("第一行代碼", 552)
val result = book.save()
Log.d(TAG, "save result is $result , book id is ${book.id}")

可以看到,這裏我們先創建了一個Book的實例,並傳入書名和頁數,然後調用save()方法就可以將這條數據存儲到數據庫中了。存儲結束後這裏還用一條打印日誌打印出了執行結果,如下所示:

D/MainActivity: save result is true , book id is 1

可以看到,這裏顯示存儲成功,並且book的id值變成了1,說明LitePal在存儲成功之後自動給id賦值了。

接下來我們到數據庫中具體查看一下吧,如下圖所示:

![](https://img-blog.csdn.net/20180606162935501)

再一次驗證存儲操作已經成功了。

接下來我們演示一下修改操作,代碼如下所示:

val cv = ContentValues()
cv.put("name", "第二行代碼")
cv.put("page", 570)
LitePal.update(Book::class.java, cv, 1)

其實基本上Kotlin上的用法大家都會覺得眼熟,因爲和Java都是類似的,只是具體語法可能有些不太一樣。就比如update()方法接收的第一個參數是個Class對象,在Java中我們會傳入Book.class,而在Kotlin中則需要傳入Book::class.java。

執行上述代碼,然後再到數據庫中查看一下,結果如下圖所示:

![](https://img-blog.csdn.net/2018060617012056)

沒錯,說明我們的修改操作也順利完成了。

下面看一下刪除操作,代碼如下所示:

LitePal.delete(Book::class.java, 1)

這裏我們指明要刪除id爲1的這條記錄。當然除了按照id刪除以外,你還可以按照其他任意條件去刪除,比如我們想把頁數大於500的書全部都刪掉,那麼就可以這麼寫:

LitePal.deleteAll(Book::class.java, "page > ?", "500")

好,現在執行上述任意一行代碼,然後到數據庫中觀察一下,如下圖所示:

![](https://img-blog.csdn.net/20180606170946909)

沒有問題,可以看到這裏數據庫已清空,說明我們的刪除操作確實生效了。

最後,再向大家演示一下查詢的操作。由於現在數據庫中已沒有數據可查,那麼我們先向庫中添加兩條數據,然後再執行查詢操作,代碼如下所示:

Book("第一行代碼", 552).save()
Book("第二行代碼", 570).save()

LitePal.findAll(Book::class.java).forEach {
    Log.d(TAG, "book name is ${it.name} , book page is ${it.page}")
}

這裏調用了findAll()方法,將Book表中的所有數據都查詢了出來。查詢的結果是一個List集合,因此我們又用了Kotlin中的forEach循環將查詢到的每條記錄都打印了出來。執行結果如下所示:

D/MainActivity: book name is 第一行代碼 , book page is 552
D/MainActivity: book name is 第二行代碼 , book page is 570

當然,除了調用findAll()方法之外,我們還可以使用LitePal的連綴查詢來對查詢條件進行任意地定製:

LitePal.where("name like ?", "第_行代碼")
       .order("page desc")
       .limit(5)
       .find(Book::class.java)

這樣我們就將在Kotlin中使用LitePal進行CRUD操作全部都演示完了,是不是感覺和Java中一樣的簡單和方便呢?當然,除了這些新功能之外,我還修復了一些已知的bug,提升了整體框架的穩定性,如果這些正是你所需要的話,那就趕快升級吧。

我沒學過LitePal怎麼辦?

本篇文章是寫給已經有LitePal基礎的人看的,幫助他們快速地升級到LitePal 2.0。如果你之前並沒有學過LitePal,可以參考《第一行代碼 第2版》第6章中的內容,裏面有非常詳盡的LitePal使用講解。

另外也可以閱讀我寫的專欄《Android數據庫高手祕籍》,同樣對LitePal的各種使用方法進行了詳細地剖析。


關注我的技術公衆號,每天都有優質技術文章推送。關注我的娛樂公衆號,工作、學習累了的時候放鬆一下自己。

微信掃一掃下方二維碼即可關注:

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章