Android 資料庫框架 DBFlow 的使用
原文首發於微信公眾號:jzman-blog,歡迎關注交流!
DBFlow 是一個基於註解處理器開發的使用方便的 ORM Android 資料庫,該庫簡化了很多多餘的程式碼,並且提供了好用的 API 來處理與資料庫的互動,讓開發者專注 App 的開發。下面將從以下幾個方面來學習 DBFlow 資料庫框架的使用,具體如下:
1. DBFlow 的優勢
2. 配置 DBFlow
3. 建立資料庫
4. 建立表
5. 插入資料
6. 刪除資料
7. 更新資料
8. 查詢資料
9. 案例
DBFlow 的優勢
DBFlow 借鑑了一些其他優秀資料庫框架的特性,下面是 DBFlow 的優勢,具體如下:
1. Extensibility(擴充套件性)
2. Speed(速度):該庫基於 Java 的註解處理器生成,使用它對執行時效能幾乎沒有任何影響(反射僅僅用於生資料庫模組的生成),可以節省生成樣板程式碼的時間,支援模型快取(多主鍵模型),在可能的情況下比原生的 SQLite 速度要快,支援懶載入、@ForeignKey、@OneToMany等使得查詢更有效率。
3. SQLite Query Flow(SQLite查詢流)
select(name, screenSize).from(Android.class).where(name.is("Nexus 5x")).and(version.is(6.0)).querySingle()
- Open Source(開源):DBFlow 時開源的,開源地址:Github
- Robust(健壯性):支援 Trigger, ModelView, Index, Migration 以及內建的管理資料庫的方式, 此外,還支援 SQLCipher, RXJava 等
- Multiple Databases, Multiple Modules(多資料庫、多模型)
- Built On SQLite(基於 SQLite):SQLite 是世界上使用最廣泛的資料庫引擎,它不僅限於某個平臺。
配置 DBFlow
因為 DBFlow 任然不是官方釋出的,你需要在專案的 build.gradle 檔案中進行如下配置,具體如下:
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
然後,在 Module 對應的 build.gradle 檔案中新增依賴,具體如下:
//為了方便可使用 def 關鍵字定義版本號
def dbFlow_version = "4.2.4"
dependencies {
//...
annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:${dbFlow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbFlow_version}"
compile "com.github.Raizlabs.DBFlow:dbflow:${dbFlow_version}"
}
上面程式碼中的依賴只是針對於 Java,如果你要使用 Kotlin、RxJava 等要配置相對應的依賴即可。
注意:升級新版本的 DBFlow 時,一定要刪除舊版本的依賴,因為新舊版本的註解處理器可能不同,如果未移除舊版本,將會報如下錯誤,具體如下:
java.lang.NoSuchMethodError: com.raizlabs.android.dbflow.annotation.Table.tableName()Ljava/lang/String
然後,自定義 Application ,在相應的 onCreate() 方法中初始化 DBFlow,具體如下:
/**
* 自定義Application
* @author jzman
* create at 2018/4/16 0016 17:28
*/
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//初始化DBFlow
FlowManager.init(new FlowConfig.Builder(this).build());
//設定日誌顯示
FlowLog.setMinimumLoggingLevel(FlowLog.Level.V);
}
}
最後,在 AndroidManifest.xml 檔案中使用自定義的 Application,具體如下:
<application
android:name=".app.MyApplication"
// ...
</application>
此時,DBFlow 就引入當前專案中咯。
建立資料庫
建立一個類並使用 @Database 註解來定義自己的資料庫,該類應該要定義資料庫的名稱和資料庫的版本,具體如下:
/**
* MyDatabase
* @author jzman
* create at 2018/4/17 0017 9:08
*/
@Database(name = MyDatabase.NAME, version = MyDatabase.VERSION)
public class MyDatabase {
//資料庫名稱
public static final String NAME = "MyDatabase";
//資料庫版本號
public static final int VERSION = 1;
}
注意:如果以後要修改任意表的結構,為避免與舊版本資料庫衝突一定要修改版本號,且保證版本號只升不降。
建立表
在已經建立好資料庫的前提下就可以建立表了,表的模型類一般需要繼承 BaseModel,併為模型類中的每個欄位新增 @Column 註解,該註解將對映模型類的欄位到對應表中的列,定義一張表具體如下:
/**
* NoteTable.java
* @author jzman
* create at 2018/4/17 0017 9:54
*/
@Table(database = MyDatabase.class)
public class NoteTable extends BaseModel {
@Column
@PrimaryKey
int id;
@Column
private String title;
@Column
private String date;
@Column
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
注意:在一張表中至少必須定義一個欄位作為主鍵(primary key),如果模型類中某個欄位是私有的,一定要定義相應的 getter、setter 方法,否則會在建立表的環節失敗,表的命名要使用駝峰命名法,否則可能會出現如此下問題:
java.lang.IllegalArgumentException: expected type but was null
插入資料
使用 DBFlow 插入資料常用的有二種方式,具體如下:
1. model.insert()
2. SQLite.insert()
前者用於單個模型類物件的的插入,建立完具體的物件後,呼叫 model.insert() 即可插入該物件所對應的記錄;後者使用 SQLite Wrapper Language 來插入資料,類似於原生的 insert 語句,支援多列資料的插入,使用起來比較方便,具體參考如下:
/**
* 插入資料
* @param model
*/
public void inseartData(NoteBean model){
//1.model,insert()
model.setTitle("title");
model.setDate("2018-04-17");
model.setContent("content");
model.insert();
//2.SQLite.insert()
SQLite.insert(NoteBean.class)
.columns(NoteBean_Table.title,NoteBean_Table.date,NoteBean_Table.content)
.values("title","2018-04-17","content")
.execute();
}
刪除資料
使用 DBFlow 刪除資料常用的有二種方式,具體如下:
1. model.delete():刪除某條記錄
2. SQLite.delete():根據條件刪除
前者用於單個模型類物件的的刪除,建立完具體的物件後,呼叫 model.delete() 即可刪除該物件所對應的記錄;後者使用 SQLite Wrapper Language 來條件刪除資料,類似於原生的 delete 語句,使用起來比較方便,具體參考如下:
/**
* 刪除資料
* @param model
*/
public void deleteData(NoteBean model){
//1.model.delete()
model.delete();
//2.SQLite.delete()
SQLite.delete(NoteBean.class)
.where(NoteBean_Table.title.is("title"))
.and(NoteBean_Table.id.is(10))
.async()
.execute();
//刪除整張表
Delete.table(NoteBean.class);
//刪除多張表
Delete.table(NoteBean.class,NoteBean1.class);
}
更新資料
使用 DBFlow 刪除資料常用的有二種方式,具體如下:
1. model.update():更新某條記錄
2. SQLite.update():根據條件更新某條記錄
前者用於單個模型類物件的的更新,建立完具體的物件後,呼叫 model.update() 即可更新該物件所對應的記錄;後者使用 SQLite Wrapper Language 來條件刪除資料,類似於原生的 update 語句,使用起來比較方便,具體參考如下:
/**
* 更新資料
* @param model
*/
public void updateData(NoteBean model) {
//1.model.update()
model.update();
//2.SQLite.update()
SQLite.update(NoteBean.class)
.set(NoteBean_Table.title.eq("title"),
NoteBean_Table.content.eq("content"))
.where(NoteBean_Table.id.is(10))
.async()
.execute();
}
查詢資料
查詢使用 SQLite.select() 方法,查詢還有許多可以作為條件的關鍵字,這裡就不在贅述了,下面是一個開發者做常用的查詢,具體參考如下:
/**
* 查詢資料
*/
public List<NoteBean> queryData(){
//根據條件查詢
List<NoteBean> noteBeans = SQLite.select()
.from(NoteBean.class)
.where(NoteBean_Table.title.is("title"))
.queryList();
return noteBeans;
}
注意:對於插入、更新操作可以使用 model.save() 方法。
案例
上文中介紹了 DBFlow 的配置以及增刪改查等基本操作,DbFlow 還有其他比較高階的用法,比如使用 Transactions 來進行資料的安全操作等,下面寫一個簡單的案例來結束對 DBFlow 的學習,具體效果如下:
更多關於 DBFlow 的知識請參考 DBFlow 的 GitBook 。
如果覺得對自己有幫助,可以關注微信公眾號:jzman-blog,一起交流學習。