Android框架(1)| LitePal

本節目錄
LitePal簡介
LitePal是一款開源的Android資料庫框架,採用了物件關係對映(ORM)的模式,將平時開發時最常用的一些資料庫功能進行了封裝,使得開發者不用編寫一行SQL語句就可以完成各種建表、増刪改查的操作。並且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檔案了,我們右鍵點選main—New—Direction,建立一個assets目錄,然後在該目錄下新建一個litepal.xml的檔案,然後修改該檔案中的內容:
<?xml version="1.0" encoding="utf-8" ?> <litepal> <dbname value="BookStore"></dbname> <version value="1"></version> <list> </list> </litepal>
這裡面的屬性來具體介紹一下,首先是<dbname>,它是指我們要建立的資料庫的名字;<version>則是指我們資料庫的版本號;<list>則是我們要指定的對映模型。
最後就是在AndroidManifest.xml中的<application>中配置一下LitaPalApplication了:
<application android:name="org.litepal.LitePalApplication" ......
到這裡配置就結束了,下面我們就來看一下它的具體用法吧!
使用LitePal建立和升級資料庫
1.建立資料庫
因為LitePal採用了物件關係對映(ORM)的模式,因此簡單來說就是可以讓我們按照面向物件程式設計的思維來完成資料庫的操作。所以我們就直接先建立一個Book類,並在其中新增一些有關書籍的資訊:
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; } }
接著我們來將Book類新增到litepal.xml當中:
<list> <mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping> </list>
我們在<list>標籤中將我們的Book類的完整路徑給新增進去就可以了。
最後我們來修改主程式碼:
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();//建立資料庫 } }); } }
我們先在佈局中添加了一個按鈕,然後為該按鈕新增相應的點選事件,我們這裡是點選按鈕之後會創建出我們的“BookStore.dp”資料庫。這裡我們使用的是對LitePal使用getDatabase()方法來進行建立的。
之後點選按鈕,即可建立資料庫成功。同樣我們也可以使用adb shell來進行檢視。
2.升級資料庫
使用LitePal升級資料庫也是很簡單的,我們需要在我們建立的類中新增我們想要部分,然後在litepal.xml中將版本號加1即可。
...... int year; public int getYear(){ return year; } public void setYear(int year){ this.year = year; } ......
我們在Book類中添加了一個year常量。接著我們再來修改版本號:
<?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>
我們在這裡將版本號增加了1,之後我們再次執行程式,點選按鈕便會發現我們的“BookStore”中已經有了year這一項了。
LitePal的CRUD操作
LitePal中進行CRUD操作的前提是要讓我們的表類繼承自LitePalSupport,所以我們在開始先修改我們的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); } ......
接著在佈局檔案中再新增四個按鈕來分別表示之後要進行的CRUD操作。
...... <Button android:id="@+id/add" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="新增資料"/> <Button android:id="@+id/update" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="更新資料"/> <Button android:id="@+id/delete" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="刪除資料"/> <Button android:id="@+id/query" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查詢資料"/> ......
下面我們就來對我們的資料庫進行操作吧!
1.新增資料
新增資料主要是使用Book類繼承而來的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(); } }); ......
我們在這裡是建立了兩行資料:book1和book2。我們建立的方法就是按照面向物件的思維來進行建立的,即構造相應的物件然後呼叫其內部的方法。最後我們就對每一個物件使用save()方法即可新增資料成功。
2.更新資料
更新資料同樣使用的是繼承而來的updateAll()方法來進行。我們修改主程式碼:
...... 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()方法中的引數,這裡使用的引數和sql語句中的很像,同樣也是在前面使用佔位符?,然後在後面進行具體的限制。這裡我們更新資料的具體含義是將bookName為the book 1的書的price改為18.8,year改為2018。
在更新資料時有一個地方是需要我們特別注意的,就是當我們想要把表中的某一列更新為該型別的預設值時,是不可以使用上面的set...()方法的。例如我們想要把year(為int型)改為0,則我們不能使用 book.setYear(0);
,因為int型別的資料的預設值就是0。如果我們想要將資料更新為預設值,我們可以使用setToDefault()方法,例如我們想要把year改成預設值:
Book book = new Book(); book.setToDefault("year"); book.updateAll("bookName = ?","the book 1");
我們直接在setToDefault()方法中傳入我們想要修改的列名即可。
3.刪除資料
刪除資料需要我們使用LitePal中的靜態方法deleteAll()方法進行操作。我們修改主程式碼:
...... 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()方法中我們第一個引數就是要指定是哪一張表。而後面的引數就是我們很熟悉的約束條件了。這裡的含義是將Book表中price小於190的資料全部刪除。
4.查詢資料
查詢資料是使用LitePal中的findAll()方法來實現的。我們繼續修改主程式碼:
...... 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()方法需要傳入的引數就是我們指定要查詢的表,而它在呼叫完之後會返回一個Book型別的List,這樣我們就成功的將資料轉移到我們的books列表中了,之後我們只需要呼叫get...()方法來取得資料即可。
除此以外,LitePal中還有許多具體的查詢操作API:
- findFirst()
我們只需要傳入要查詢的表作為引數,即可返回一個物件,該物件中有該表第一行的所有資料。 - select()
用於查詢哪幾列的資料,距離來說:
List<Book> books = LitePal.select("bookName","author").find(Book.class);
這段程式碼的意思是指查詢Book表中bookName和author這兩列的資料。
-
where()
和sql語句中的where所表示的意思是相同的,主要是用來進行約束。
List<Book> books = LitePal.select("pages > ?","175").find(Book.class);
-
order()
用於指定結果的排列方式,一般傳入desc(降序排列)或者asc(升序排列)。
List<Book> books = LitePal.order("price desc").find(Book.class);
當然還有更多的API,如果想要了解可以去LitePal的官方文件中檢視。