Android LitePal的使用詳解
前言
資料庫操作一直都是比較繁瑣而且單一的東西,平時開發中資料庫也很常見。有學過mysql的讀者可能會覺得sql語句確實讓人很難受。同樣android中,雖然有內建資料庫SQLite,但是操作起來還是非常的不方便。跟網路請求類似,當我們用原生的HttpURLConnection請求資料再用json解析,過程很繁瑣,所以我們一般是封裝成一個工具類,但是retrofit出現了,他幫我們解決了網路請求和解析資料的封裝,同時還支援RxJava的非同步,十分強大。不瞭解retrofit的讀者也建議你們去學習一下retrofit確實非常好用。LitePal也是同樣的道理,把建立資料庫和增刪查改等等操作都封裝起來,所以我們用起來會非常的方便。同時還支援非同步操作,不需要我們自己去開啟子執行緒,程式碼非常的整潔,簡單。那接下來就來看看這個神奇的框架LitePal。
簡述對映
LitePal是採用對映的方式來把資料儲存在資料庫中的,和GSON的道理是一樣的。例如我們現在有一個類,這個類必須是javaBean類:
public class Student extends LitePalSupport { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
那麼他在資料庫中就會有一個表,這個表有三列:id,name和age,id是自動生成的,這樣就可以理解映射了吧。所以我們使用LitePal的時候不用去指定每一列是什麼,只需要給他一個Bean類,自動就會生成了。
配置LitePal
LitePal使用之前需要先配置一下,一共分為兩步:
- 新增依賴庫:在app/build.gradle中新增如下內容:
dependencies { implementation 'org.litepal.android:java:3.0.0' }
其中3.0.0是版本號,寫這個文章的時候是3.0,他更新也是很快的,讀者可以自行到文末進入官網查詢最新的版本號。新增完之後sync一下就行了。
- 修改AndroidManifest中的程式碼:新增一句android:name=”org.litepal.LitePalApplication”:
<application android:name="org.litepal.LitePalApplication" ... <application
新增這句的意思是讓啟動app的時候會自動例項化LitePalApplication這個類供給LitePal這個框架使用。如果有自己寫了一個android:name的,那麼只需要新增這一句LitePal.initialize(context);就可以了。其中的context引數為全域性app的context。例如: ```java public class myApplication extends Application { private static Context context; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); LitePal.initialize(context); } }
- 在main目錄下建立一個Directory:assets。然後再assets目錄下再建立一個litepal.xml,如下圖:
- 編輯litepal.xml中的內容:
<?xml version="1.0" encoding="utf-8"?> <litepal> <dbname value="bookStore"/> <version value="1"/> <list> </list>
``` dbname就是資料庫的名字,version是資料庫的版本,list中是資料庫中的表,可以在這裡新增,怎麼新增後面會講到。
CRUD操作
常規增刪查改操作,但是在這個框架下都顯得特別的簡單。
增加表和資料
例如我們現在要在資料庫中建立一個學生的表,首先要建立一個學生的類,再讓他繼承LitePalSupport類,至於為什麼下面會講到:
public class Student extends LitePalSupport { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
然後在剛才的litepal.xml中新增表:
<list> <mapping class="com.example.myapplication.Student"/> </list>
這裡的class要是你的類的真實目錄,視具體情況而定。 新增其他的表也是同樣的道理。 呼叫student物件的save()方法: ```java Student student = new Student(); student.setAge(12); student.setName("hha"); student.save();
這裡的save方法就是繼承前面的LitePalSuppport類的,呼叫這個方法後就會自動新增到庫中對應的表中的一行。
新增其他行資料也是同樣的道理
更改表結構
更新表的列。例如前面的學生類是name和age,但是如果你想要增加一個studentId,可以很簡單地實現。具體操作如下:
首先更改你的bean類,想怎麼改就怎麼改
在litepal.xml中更改版本號增加1.例如:
<?xml version="1.0" encoding="utf-8"?> <litepal> <dbname value="bookStore"/> <version value="2"/> <list> <mapping class="com.example.myapplication.Student"/> </list>
``` 把他改成2就行了。 ## 刪除資料 刪除資料也很簡單,有兩種刪除方法,一種是指定行刪除,一種給個約束條件刪除。 1. 刪除單行: LitePal.delete(Student.class,id); 2. 約束條件: LitePal.deleteAll(Student.class,"age > ?","12"); 指定約束條件刪除,?是佔位符會把後面的12放進去。 如果只傳入一個Student.class,那麼就會把整個表的資料都刪除了
查詢資料
查詢資料的介面都會返回一個List,每一行對應一個物件。所以是LitePal把資料解析都給我們做好了,我們直接拿物件使用就ok了。這裡有幾種方法介面都看一下:
LitePal.findAll(Student.class,id);查詢對應表的對應行,如果沒有傳入id引數,就返回這個表的所有內容。同樣findFirst是返回第一行,findLast是返回最後一行。
查詢的內容還可以進行篩選,這裡就用到幾個方法:
- select()對應查哪幾列的內容
- where()查詢的約束條件
- order()排序方式
- limit()指定查詢的數量
- offset()指定結果的偏移量。這個可能比較難理解,舉個例子:假設你查的id是1,但是你設定了偏移量是1,那麼返回的就是第二行的資料。
最後舉一個綜合例子演示一下:
List<Song> songs = LitePal.where("name like ? and duration < ?","song%","200") .order("duration") .select("name") .limit(3) .offset(3) .find(Song.class);
這樣就可以查詢到對應的資料了。 # 非同步操作 有時候如果我們的資料庫中的內容很多,涉及到重量級的資料庫操作往往是比較費時的,那麼這個時候肯定時不能放在主執行緒去進行操作的,這樣會造成系統卡死。那麼我們就需要去把這個操作放在子執行緒中。LitePal早就為我們考慮到這個問題了,所以也增加了非同步操作,輕鬆實現,來看看怎麼用吧。 先看個例子: ```java LitePal.findAllAsync(Song.class).listen(new FindMultiCallback<Song>() { @Override public void onFinish(List<Song> allSongs) { } });
這是在官網中的例子,要注意的兩個點
用findAllAsync代替findAll方法
新增listen方法,並新建匿名類FindMultiCallback<>()作為引數,重寫裡面的onFinish方法即可
這樣獲取完資料後就會執行onFinish方法了
輕鬆實現非同步操作。同樣這個可以結合上面的資料篩選。
建立多個數據庫
如果你一個數據庫不夠用,想要建立多個數據庫,當然也是可以的,看程式碼:
LitePalDB litePalDB = new LitePalDB("demo2",1); litePalDB.addClassName(Singer.class.getName()); LitePal.use(litePalDB);
這裡就建立了一個庫叫做demo2,並增加了一個表:Singer。最後執行LitePal.use方法來啟用這個庫。這樣的話就預設使用這個庫了。物件的save方法都會執行到這個庫中
如果想切回到litepal.xml中的那個庫,可以用下面的方法:
LitePal.useDefault();
如果想刪除一個庫(刪庫跑路可能會被亂棒打死)
LitePal.deleteDatabase(“demo2”);
是不是很簡單?
監聽資料庫建立或者升級
當資料庫建立或者升級的時候都會呼叫下面的兩個方法:
LitePal.registerDatabaseListener(new DatabaseListener() { @Override public void onCreate() { // fill some initial data } @Override public void onUpgrade(int oldVersion,int newVersion) { // upgrade data in db } });
可以在裡面寫要執行的邏輯。
總結
LitePal這個庫確實是非常的強大,把很複雜的資料庫操作都簡化成了一個個的方法。但是更新很快,需要時刻看著他更新的內容,有可能會換API,所以建議大家多去官網學習。
以上就是Android LitePal的使用詳解的詳細內容,更多關於Android LitePal的資料請關注我們其它相關文章!