LitePal簡(jiǎn)介
LitePal是一款開源的Android數(shù)據(jù)庫(kù)框架盾戴,采用了對(duì)象關(guān)系映射(ORM)的模式尖啡,將平時(shí)開發(fā)時(shí)最常用的一些數(shù)據(jù)庫(kù)功能進(jìn)行了封裝可婶,使得開發(fā)者不用編寫一行SQL語(yǔ)句就可以完成各種建表援雇、増刪改查的操作惫搏。并且LitePal很“輕”具温,jar包大小不到100k,而且近乎零配置筐赔。
框架地址:https://github.com/LitePalFramework/LitePal
配置LitePal
如果要使用到LitePal框架铣猩,首先就是要添加依賴了,打開app目錄中的的build.gradle茴丰,然后在dependencies閉包中添加:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'org.litepal.android:java:3.0.0' //添加依賴
}
接著就是需要配置litepal.xml文件了达皿,我們右鍵點(diǎn)擊main—New—Direction,創(chuàng)建一個(gè)assets目錄贿肩,然后在該目錄下新建一個(gè)litepal.xml的文件峦椰,然后修改該文件中的內(nèi)容:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list>
</list>
</litepal>
這里面的屬性來(lái)具體介紹一下汰规,首先是<dbname>汤功,它是指我們要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)的名字;<version>則是指我們數(shù)據(jù)庫(kù)的版本號(hào)溜哮;<list>則是我們要指定的映射模型滔金。
最后就是在AndroidManifest.xml中的<application>中配置一下LitaPalApplication了:
<application
android:name="org.litepal.LitePalApplication"
......
到這里配置就結(jié)束了,下面我們就來(lái)看一下它的具體用法吧茂嗓!
使用LitePal創(chuàng)建和升級(jí)數(shù)據(jù)庫(kù)
1.創(chuàng)建數(shù)據(jù)庫(kù)
因?yàn)長(zhǎng)itePal采用了對(duì)象關(guān)系映射(ORM)的模式餐茵,因此簡(jiǎn)單來(lái)說(shuō)就是可以讓我們按照面向?qū)ο缶幊痰乃季S來(lái)完成數(shù)據(jù)庫(kù)的操作。所以我們就直接先創(chuàng)建一個(gè)Book類述吸,并在其中添加一些有關(guān)書籍的信息:
package com.example.yzbkaka.litepaltest;
public class Book {
int id;
String bookName;
String author;
double price;
int pages;
public int getId(){
return id;
}
public String getBookName(){
return bookName;
}
public String getAuthor(){
return author;
}
public double getPrice(){
return price;
}
public int getPages(){
return pages;
}
public void setId(int id){
this.id = id;
}
public void setBookName(String bookName){
this.bookName = bookName;
}
public void setAuthor(String author){
this.author = author;
}
public void setPrice(double price){
this.price = price;
}
public void setPages(int pages){
this.pages = pages;
}
}
接著我們來(lái)將Book類添加到litepal.xml當(dāng)中:
<list>
<mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping>
</list>
我們?cè)?lt;list>標(biāo)簽中將我們的Book類的完整路徑給添加進(jìn)去就可以了钟病。
最后我們來(lái)修改主代碼:
package com.example.yzbkaka.litepaltest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import org.litepal.LitePal;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button create = (Button)findViewById(R.id.create);
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LitePal.getDatabase(); //創(chuàng)建數(shù)據(jù)庫(kù)
}
});
}
}
我們先在布局中添加了一個(gè)按鈕,然后為該按鈕添加相應(yīng)的點(diǎn)擊事件刚梭,我們這里是點(diǎn)擊按鈕之后會(huì)創(chuàng)建出我們的“BookStore.dp”數(shù)據(jù)庫(kù)肠阱。這里我們使用的是對(duì)LitePal使用getDatabase()方法來(lái)進(jìn)行創(chuàng)建的。
之后點(diǎn)擊按鈕朴读,即可創(chuàng)建數(shù)據(jù)庫(kù)成功屹徘。同樣我們也可以使用adb shell來(lái)進(jìn)行查看。
2.升級(jí)數(shù)據(jù)庫(kù)
使用LitePal升級(jí)數(shù)據(jù)庫(kù)也是很簡(jiǎn)單的衅金,我們需要在我們創(chuàng)建的類中添加我們想要部分噪伊,然后在litepal.xml中將版本號(hào)加1即可簿煌。
......
int year;
public int getYear(){
return year;
}
public void setYear(int year){
this.year = year;
}
......
我們?cè)贐ook類中添加了一個(gè)year常量。接著我們?cè)賮?lái)修改版本號(hào):
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="2"></version>
<list>
<mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping>
</list>
</litepal>
我們?cè)谶@里將版本號(hào)增加了1鉴吹,之后我們?cè)俅芜\(yùn)行程序姨伟,點(diǎn)擊按鈕便會(huì)發(fā)現(xiàn)我們的“BookStore”中已經(jīng)有了year這一項(xiàng)了。
LitePal的CRUD操作
LitePal中進(jìn)行CRUD操作的前提是要讓我們的表類繼承自LitePalSupport豆励,所以我們?cè)陂_始先修改我們的Book類代碼:
import org.litepal.crud.LitePalSupport;
public class Book extends LitePalSupport {
int id;
String bookName;
String author;
double price;
int pages;
int year;
public Book(String errorMessage) {
super(errorMessage);
}
......
接著在布局文件中再添加四個(gè)按鈕來(lái)分別表示之后要進(jìn)行的CRUD操作夺荒。
......
<Button
android:id="@+id/add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加數(shù)據(jù)"/>
<Button
android:id="@+id/update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新數(shù)據(jù)"/>
<Button
android:id="@+id/delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="刪除數(shù)據(jù)"/>
<Button
android:id="@+id/query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查詢數(shù)據(jù)"/>
......
下面我們就來(lái)對(duì)我們的數(shù)據(jù)庫(kù)進(jìn)行操作吧!
1.添加數(shù)據(jù)
添加數(shù)據(jù)主要是使用Book類繼承而來(lái)的save()方法良蒸。我們直接修改主代碼:
......
Button add = (Button)findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book1 = new Book();
book1.setBookName("the book 1");
book1.setAuthor("author 1");
book1.setPages(200);
book1.setPrice(16.8);
book1.setYear(2016);
book1.save();
Book book2 = new Book();
book2.setBookName("the book 2");
book2.setAuthor("author 2");
book2.setPages(180);
book2.setPrice(10.8);
book2.setYear(2017);
book2.save();
}
});
......
我們?cè)谶@里是創(chuàng)建了兩行數(shù)據(jù):book1和book2技扼。我們創(chuàng)建的方法就是按照面向?qū)ο蟮乃季S來(lái)進(jìn)行創(chuàng)建的,即構(gòu)造相應(yīng)的對(duì)象然后調(diào)用其內(nèi)部的方法嫩痰。最后我們就對(duì)每一個(gè)對(duì)象使用save()方法即可添加數(shù)據(jù)成功剿吻。
2.更新數(shù)據(jù)
更新數(shù)據(jù)同樣使用的是繼承而來(lái)的updateAll()方法來(lái)進(jìn)行。我們修改主代碼:
......
Button update = (Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setPrice(18.8);
book.setYear(2018);
book.updateAll("bookName = ?","the book 1");
}
});
......
我們直接看到updateAll()方法中的參數(shù)串纺,這里使用的參數(shù)和sql語(yǔ)句中的很像丽旅,同樣也是在前面使用占位符?纺棺,然后在后面進(jìn)行具體的限制榄笙。這里我們更新數(shù)據(jù)的具體含義是將bookName為the book 1的書的price改為18.8,year改為2018五辽。
在更新數(shù)據(jù)時(shí)有一個(gè)地方是需要我們特別注意的办斑,就是當(dāng)我們想要把表中的某一列更新為該類型的默認(rèn)值時(shí),是不可以使用上面的set...()方法的杆逗。例如我們想要把year(為int型)改為0乡翅,則我們不能使用book.setYear(0);
,因?yàn)閕nt類型的數(shù)據(jù)的默認(rèn)值就是0罪郊。如果我們想要將數(shù)據(jù)更新為默認(rèn)值蠕蚜,我們可以使用setToDefault()方法,例如我們想要把year改成默認(rèn)值:
Book book = new Book();
book.setToDefault("year");
book.updateAll("bookName = ?","the book 1");
我們直接在setToDefault()方法中傳入我們想要修改的列名即可悔橄。
3.刪除數(shù)據(jù)
刪除數(shù)據(jù)需要我們使用LitePal中的靜態(tài)方法deleteAll()方法進(jìn)行操作靶累。我們修改主代碼:
......
Button delete = (Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LitePal.deleteAll(Book.class,"price < ?","190");
}
});
......
在deleteAll()方法中我們第一個(gè)參數(shù)就是要指定是哪一張表。而后面的參數(shù)就是我們很熟悉的約束條件了癣疟。這里的含義是將Book表中price小于190的數(shù)據(jù)全部刪除挣柬。
4.查詢數(shù)據(jù)
查詢數(shù)據(jù)是使用LitePal中的findAll()方法來(lái)實(shí)現(xiàn)的。我們繼續(xù)修改主代碼:
......
Button query = (Button)findViewById(R.id.query);
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<Book> books = LitePal.findAll(Book.class);
}
});
......
findAll()方法需要傳入的參數(shù)就是我們指定要查詢的表睛挚,而它在調(diào)用完之后會(huì)返回一個(gè)Book類型的List邪蛔,這樣我們就成功的將數(shù)據(jù)轉(zhuǎn)移到我們的books列表中了,之后我們只需要調(diào)用get...()方法來(lái)取得數(shù)據(jù)即可扎狱。
除此以外侧到,LitePal中還有許多具體的查詢操作API:
-
findFirst()
我們只需要傳入要查詢的表作為參數(shù)勃教,即可返回一個(gè)對(duì)象,該對(duì)象中有該表第一行的所有數(shù)據(jù)匠抗。 -
select()
用于查詢哪幾列的數(shù)據(jù)故源,距離來(lái)說(shuō):
List<Book> books = LitePal.select("bookName","author").find(Book.class);
這段代碼的意思是指查詢Book表中bookName和author這兩列的數(shù)據(jù)。
-
where()
和sql語(yǔ)句中的where所表示的意思是相同的汞贸,主要是用來(lái)進(jìn)行約束绳军。
List<Book> books = LitePal.select("pages > ?","175").find(Book.class);
-
order()
用于指定結(jié)果的排列方式,一般傳入desc(降序排列)或者asc(升序排列)著蛙。
List<Book> books = LitePal.order("price desc").find(Book.class);
當(dāng)然還有更多的API删铃,如果想要了解可以去LitePal的官方文檔中查看耳贬。