DBFlow,綜合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等庫的優勢。同時不是基於反射,因此性能也是很是高,效率緊跟greenDAO其後。基於註解,使用apt技術,在編譯過程當中生成操做類,使用方式和ActiveAndroid高度類似,使用簡單。android
DBFlow在國內可能用的人不是不少,因此中文介紹不多,因此就有了這篇文章,接下來就讓咱們一塊兒學習DBFlow。git
1、引入依賴、初始化github
須要引入apt和maven,配置項目的 build.gradle數據庫
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0-beta6' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } } allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
配置app的build.gradleapp
apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' def dbflow_version = "3.0.0-beta4" android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "cn.taoweiji.dbflowexample" minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) apt "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}" }
須要在Application的onCreate對DBFlow進行初始化異步
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); FlowManager.init(this); } }
記得修改AndroidManifest.xmlmaven
<application android:name=".MyApplication" ../>
2、數據庫建立、表建立ide
定義數據庫性能
我這裏定義了一個名稱叫作AppDatabase的數據庫,能夠根據本身的喜歡進行定義。學習
@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION) public class AppDatabase { //數據庫名稱 public static final String NAME = "AppDatabase"; //數據庫版本號 public static final int VERSION = 1; }
建立數據庫對象
必須繼承BaseModel,BaseModel包含了基本的數據庫操做(save、delete、update、insert、exists),看下面代碼能夠發現這個表是關聯上面定義的數據庫,People的id是自增的id。
@ModelContainer @Table(database = AppDatabase.class) public class People extends BaseModel { //自增ID @PrimaryKey(autoincrement = true) public Long id; @Column public String name; @Column public int gender; }
編寫完數據表對象後,點擊Android studio的build->Make Project(Mac的童鞋直接command+F9)就會使用apt進行了編譯,
查看目錄(個人people類放在cn.taoweiji.dbflowexample.db)
app/build/generated/source/apt/debug/cn/taoweiji/dbflowexample/db
就能夠看到自動生成 People_Adapter、People_Container、People_Table,其中People_Table在後面使用有很大的做用,建議詳細看看它的結構。
3、增刪改
因爲數據表對象繼承了BaseModel,已經包含了不少的操做
People people = new People(); people.name = "Wiki"; people.gender = 1; people.save(); //people.update(); //people.delete(); Log.e("Test", String.valueOf(people.id));
刪除、更新等操做就本身體驗,這裏就很少說了。
4、查詢
//返回全部查詢結果 List<People> peoples = new Select().from(People.class).queryList(); //返回單個查詢結果 People people = new Select().from(People.class).querySingle(); //查詢gender = 1的全部People List<People> peoples2 = new Select().from(People.class).where(People_Table.gender.eq(1)).queryList();
DBFlow的查詢方式借鑑ActiveAndroid的,可是比ActiveAndroid功能還要強大。
4、事務、批量保存
事務是一個數據必須具有的,若是保存10000條數據,一條一條保存必然是很慢的,因此就須要用到事務,批量保存。DBFlow的事務很是的強大,同時使用也很複雜,這裏就簡單介紹批量保存,更多內容請查看官方文檔
https://github.com/Raizlabs/DBFlow/blob/master/usage/Transactions.md
List<People> peoples = new ArrayList<>(); for (int i = 0; i < 1000; i++) { People people = new People(); people.name = "Wiki"; people.gender = 1; peoples.add(people); } //實時保存,立刻保存 new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)).onExecute(); //異步保存,使用異步,若是馬上查詢可能沒法查到結果 //TransactionManager.getInstance().addTransaction(new SaveModelTransaction<>(ProcessModelInfo.withModels(peoples)));
5、數據庫升級(增長表、增長字段等)
若是是新增表無需作特別的處理,直接修改AppDatabase的版本號便可。
若是須要新增字段,除了須要修改AppDatabase的版本號外,還須要作特殊的處理,DBFlow的描述是:Migrations。
例子:對People新增一個email字段
第1步,修改數據庫版本號
@Database(name = AppDatabase.NAME, version = AppDatabase.VERSION) public class AppDatabase { //數據庫名稱 public static final String NAME = "AppDatabase"; //數據庫版本號,這裏修改2 public static final int VERSION = 2; }
第2步,須要修改數據表對象結構,增長email
@ModelContainer @Table(database = AppDatabase.class) public class People extends BaseModel { //自增ID @PrimaryKey(autoincrement = true) public Long id; @Column public String name; @Column public int gender; @Column public String email; }
第3步,執行第二步以後,須要build(Android studio的build->Make Project、Mac的童鞋直接command+F9),經過apt更新People_Table,接下來編寫Migrations
@Migration(version = 2, database = AppDatabase.class) public class Migration_2_People extends AlterTableMigration<People> { public Migration_2_People(Class<People> table) { super(table); } @Override public void onPreMigrate() { addColumn(SQLiteType.TEXT, People_Table.email.getNameAlias().getName()); } }
類名能夠更加本身喜歡定義,我我的的規則是,按照數據庫版本號和須要更新的數據表來命名,須要注意是:version = 2
數據庫升級就大功告成了。
總結:這篇文章只是簡單介紹了DBFlow的基本功能使用,DBFlow還有不少很厲害的功能,好比多數據庫支持、Powerful Model Caching等,並且還支持Kotlin語言(運行在Java虛擬機的新語言)。我只使用過greenDAO、activeAndroid、afinal、DBFlow數據庫,因此在我看來,DBFlow是我用過的數據庫當中最好用的數據庫,性能也很好,使用很是簡單,高度推薦。
我在github上共享一下DBFlow的配置