DBFlow 是一個基於註解處理器開發的使用方便的 ORM Android 數據庫,該庫簡化了不少多餘的代碼,而且提供了好用的 API 來處理與數據庫的交互,讓開發者專一 App 的開發。下面將從如下幾個方面來學習 DBFlow 數據庫框架的使用,具體以下:java
DBFlow 借鑑了一些其餘優秀數據庫框架的特性,下面是 DBFlow 的優點,具體以下:android
select(name, screenSize).from(Android.class).where(name.is("Nexus 5x")).and(version.is(6.0)).querySingle()
由於 DBFlow 任然不是官方發佈的,你須要在項目的 build.gradle 文件中進行以下配置,具體以下:git
allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
而後,在 Module 對應的 build.gradle 文件中添加依賴,具體以下:github
//爲了方即可使用 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 就引入當前項目中咯。app
建立一個類並使用 @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 插入數據經常使用的有二種方式,具體以下:
前者用於單個模型類對象的的插入,建立完具體的對象後,調用 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 刪除數據經常使用的有二種方式,具體以下:
前者用於單個模型類對象的的刪除,建立完具體的對象後,調用 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 刪除數據經常使用的有二種方式,具體以下:
前者用於單個模型類對象的的更新,建立完具體的對象後,調用 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,一塊兒交流學習。