Android高效能ORM資料庫DBFlow入門

來源:互聯網
上載者:User

標籤:

目前Android上比較流行的ORM資料有greenDAO、OrmLite、ActiveAndroid等。

其中greenDAO不是基於反射的,效能自然是最好的,但是使用成本比較高;OrmLite、ActiveAndroid是利用註解和反射,封裝得比較好,優點就是易用性強。我個人認為,大多數應用對資料庫要求並不是很高,如果儲存或拉取資料不是很大的話是難以拉開很大差距,所以相比效能,我更加偏向易用性。

DBFlow,綜合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等庫的優點。同時不是基於反射,所以效能也是非常高,效率緊跟greenDAO其後。基於註解,使用apt技術,在編譯過程中產生操作類,使用方式和ActiveAndroid高度相似。

特性:1、無縫支援多個資料庫;2、使用annotation processing提高速度;3、ModelContainer類庫可以直接解析像JSON這樣的資料;4、增加靈活性的豐富介面。 github倉庫:https://github.com/Raizlabs/DBFlow 

DBFlow在國內可能用的人不是很多,所以中文介紹很少,所以就有了這篇文章,接下來就讓我們一起學習DBFlow。

一、引入依賴、初始化

需要引入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.gradle

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.xml

<application    android:name=".MyApplication"../>

二、資料庫建立、表建立

定義資料庫

我這裡定義了一個名稱叫做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在後面使用有很大的作用,建議詳細看看它的結構。

三、增刪改

由於資料表對象繼承了BaseModel,已經包含了很多的操作

People people = new People();people.name = "Wiki";people.gender = 1;people.save();//people.update();//people.delete();Log.e("Test", String.valueOf(people.id));

刪除、更新等操作就自己體驗,這裡就不多說了。

四、查詢

//返回所有查詢結果List<People> peoples = new Select().from(People.class).queryList();//返回單個查詢結果People people = new Select().from(People.class).querySingle();//查詢gender = 1的所有PeopleList<People> peoples2 = new Select().from(People.class).where(People_Table.gender.eq(1)).queryList();

DBFlow的查詢方式借鑒ActiveAndroid的,但是比ActiveAndroid功能還要強大。

四、事務、批量儲存

事務是一個資料必須具備的,如果儲存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)));

五、資料庫升級(增加表、增加欄位等)

如果是新增表無需做特別的處理,直接修改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的配置

https://github.com/taoweiji/DBFlowExample

 

Android高效能ORM資料庫DBFlow入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.