摘要:是一個基于注解處理器開發(fā)的使用方便的數(shù)據(jù)庫,該庫簡化了很多多余的代碼,并且提供了好用的來處理與數(shù)據(jù)庫的交互,讓開發(fā)者專注的開發(fā)。
DBFlow 是一個基于注解處理器開發(fā)的使用方便的 ORM Android 數(shù)據(jù)庫,該庫簡化了很多多余的代碼,并且提供了好用的 API 來處理與數(shù)據(jù)庫的交互,讓開發(fā)者專注 App 的開發(fā)。下面將從以下幾個方面來學(xué)習(xí) DBFlow 數(shù)據(jù)庫框架的使用,具體如下:
DBFlow 的優(yōu)勢
配置 DBFlow
創(chuàng)建數(shù)據(jù)庫
創(chuàng)建表
插入數(shù)據(jù)
刪除數(shù)據(jù)
更新數(shù)據(jù)
查詢數(shù)據(jù)
案例
DBFlow 的優(yōu)勢DBFlow 借鑒了一些其他優(yōu)秀數(shù)據(jù)庫框架的特性,下面是 DBFlow 的優(yōu)勢,具體如下:
Extensibility(擴展性):對表類的繼承類沒有限制,可以是一個普通的 JavaBean,使用時為了方便推薦表類繼承 BaseModel 類你可以擴展不同包中的非模型類,并將它們用作數(shù)據(jù)庫表,此外,你可以將其他表的子類加入到 @Column 中,并且它們可以位于不同的包中。
Speed(速度):該庫基于 Java 的注解處理器生成,使用它對運行時性能幾乎沒有任何影響(反射僅僅用于生數(shù)據(jù)庫模塊的生成),可以節(jié)省生成樣板代碼的時間,支持模型緩存(多主鍵模型),在可能的情況下比原生的 SQLite 速度要快,支持懶加載、@ForeignKey、@OneToMany等使得查詢更有效率。
SQLite Query Flow(SQLite查詢流):DBFlow 的查詢盡可能的貼近原生 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 以及內(nèi)置的管理數(shù)據(jù)庫的方式, 此外,還支持 SQLCipher, RXJava 等
Multiple Databases, Multiple Modules(多數(shù)據(jù)庫、多模型):無縫支持多數(shù)據(jù)庫文件以及使用 DBFlow 的其他依賴中的數(shù)據(jù)庫模型
Built On SQLite(基于 SQLite):SQLite 是世界上使用最廣泛的數(shù)據(jù)庫引擎,它不僅限于某個平臺。
配置 DBFlow因為 DBFlow 任然不是官方發(fā)布的,你需要在項目的 build.gradle 文件中進行如下配置,具體如下:
allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
然后,在 Module 對應(yīng)的 build.gradle 文件中添加依賴,具體如下:
//為了方便可使用 def 關(guān)鍵字定義版本號 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 等要配置相對應(yīng)的依賴即可。
注意:升級新版本的 DBFlow 時,一定要刪除舊版本的依賴,因為新舊版本的注解處理器可能不同,如果未移除舊版本,將會報如下錯誤,具體如下:
java.lang.NoSuchMethodError: com.raizlabs.android.dbflow.annotation.Table.tableName()Ljava/lang/String
然后,自定義 Application ,在相應(yīng)的 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()); //設(shè)置日志顯示 FlowLog.setMinimumLoggingLevel(FlowLog.Level.V); } }
最后,在 AndroidManifest.xml 文件中使用自定義的 Application,具體如下:
此時,DBFlow 就引入當前項目中咯。
創(chuàng)建數(shù)據(jù)庫創(chuàng)建一個類并使用 @Database 注解來定義自己的數(shù)據(jù)庫,該類應(yīng)該要定義數(shù)據(jù)庫的名稱和數(shù)據(jù)庫的版本,具體如下:
/** * MyDatabase * @author jzman * create at 2018/4/17 0017 9:08 */ @Database(name = MyDatabase.NAME, version = MyDatabase.VERSION) public class MyDatabase { //數(shù)據(jù)庫名稱 public static final String NAME = "MyDatabase"; //數(shù)據(jù)庫版本號 public static final int VERSION = 1; }
注意:如果以后要修改任意表的結(jié)構(gòu),為避免與舊版本數(shù)據(jù)庫沖突一定要修改版本號,且保證版本號只升不降。
創(chuàng)建表在已經(jīng)創(chuàng)建好數(shù)據(jù)庫的前提下就可以創(chuàng)建表了,表的模型類一般需要繼承 BaseModel,并為模型類中的每個字段添加 @Column 注解,該注解將映射模型類的字段到對應(yīng)表中的列,定義一張表具體如下:
/** * 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),如果模型類中某個字段是私有的,一定要定義相應(yīng)的 getter、setter 方法,否則會在創(chuàng)建表的環(huán)節(jié)失敗,表的命名要使用駝峰命名法,否則可能會出現(xiàn)如此下問題:
java.lang.IllegalArgumentException: expected type but was null插入數(shù)據(jù)
使用 DBFlow 插入數(shù)據(jù)常用的有二種方式,具體如下:
model.insert()
SQLite.insert()
前者用于單個模型類對象的的插入,創(chuàng)建完具體的對象后,調(diào)用 model.insert() 即可插入該對象所對應(yīng)的記錄;后者使用 SQLite Wrapper Language 來插入數(shù)據(jù),類似于原生的 insert 語句,支持多列數(shù)據(jù)的插入,使用起來比較方便,具體參考如下:
/** * 插入數(shù)據(jù) * @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(); }刪除數(shù)據(jù)
使用 DBFlow 刪除數(shù)據(jù)常用的有二種方式,具體如下:
model.delete():刪除某條記錄
SQLite.delete():根據(jù)條件刪除
前者用于單個模型類對象的的刪除,創(chuàng)建完具體的對象后,調(diào)用 model.delete() 即可刪除該對象所對應(yīng)的記錄;后者使用 SQLite Wrapper Language 來條件刪除數(shù)據(jù),類似于原生的 delete 語句,使用起來比較方便,具體參考如下:
/** * 刪除數(shù)據(jù) * @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); }更新數(shù)據(jù)
使用 DBFlow 刪除數(shù)據(jù)常用的有二種方式,具體如下:
model.update():更新某條記錄
SQLite.update():根據(jù)條件更新某條記錄
前者用于單個模型類對象的的更新,創(chuàng)建完具體的對象后,調(diào)用 model.update() 即可更新該對象所對應(yīng)的記錄;后者使用 SQLite Wrapper Language 來條件刪除數(shù)據(jù),類似于原生的 update 語句,使用起來比較方便,具體參考如下:
/** * 更新數(shù)據(jù) * @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(); }查詢數(shù)據(jù)
查詢使用 SQLite.select() 方法,查詢還有許多可以作為條件的關(guān)鍵字,這里就不在贅述了,下面是一個開發(fā)者做常用的查詢,具體參考如下:
/** * 查詢數(shù)據(jù) */ public ListqueryData(){ //根據(jù)條件查詢 List noteBeans = SQLite.select() .from(NoteBean.class) .where(NoteBean_Table.title.is("title")) .queryList(); return noteBeans; }
注意:對于插入、更新操作可以使用 model.save() 方法。
案例上文中介紹了 DBFlow 的配置以及增刪改查等基本操作,DbFlow 還有其他比較高級的用法,比如使用 Transactions 來進行數(shù)據(jù)的安全操作等,下面寫一個簡單的案例來結(jié)束對 DBFlow 的學(xué)習(xí),具體效果如下:
更多關(guān)于 DBFlow 的知識請參考 DBFlow 的 GitBook 。
可以關(guān)注微信公眾號:jzman-blog,一起交流學(xué)習(xí)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/17863.html
閱讀 2749·2021-10-09 09:44
閱讀 3557·2019-08-30 15:54
閱讀 2168·2019-08-30 14:16
閱讀 2800·2019-08-30 13:09
閱讀 830·2019-08-30 13:08
閱讀 1290·2019-08-29 16:29
閱讀 1677·2019-08-26 13:57
閱讀 1934·2019-08-26 13:53