1. 程式人生 > >Android高效能ORM資料庫DBFlow入門

Android高效能ORM資料庫DBFlow入門

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

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

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的所有People
List<People> peoples2 = new Select().from(People.class).where(People_Table.gender.eq(1)).queryList();

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

四、事務、批量儲存

事務是一個數據必須具備的,如果儲存10000條資料,一條一條儲存必然是很慢的,所以就需要用到事務,批量儲存。DBFlow的事務非常的強大,同時使用也很複雜,這裡就簡單介紹批量儲存,更多內容請檢視官方文件

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的配置

相關推薦

Android高效能ORM資料庫DBFlow入門

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

Android ORM框架GreenDao入門學習

最近想了解一下關於Android ORM的東西,在網上一搜,框架還真不少,很多人都說GreenDao效能不錯,這週末就好好搞了下。 現在Goodle推出了Android studio這款開發利器,是用Gradle構建,感覺還不錯。以下專案都是用Android studio 0.8.14開發。

Android 資料庫Realm入門

之前使用本地資料庫都是用sqllite的,偶爾用一下LitePal,聽人說Realm多麼多麼好使,但是我一直都沒有去學習,今天有空去瞅了瞅,果然很不錯。 它有以下幾種特點: 1.易用:Ream 不是在SQLite基礎上的ORM,它有自己的資料查詢引擎。並且十分容易使用。

Android ORM資料庫之GreenDao使用教程及原始碼分析

一、簡介 1.Android ORM介紹  在平時的開發過程中,大家一定會或多或少地接觸到 SQLite。然而在使用它時,我們往往需要做許多額外的工作,像編寫 SQL 語句與解析查詢結果等。所以,適用於 Android 的ORM 框架也就孕育而生了,現在市面

體驗Android ORMDBFlow

DBFlow綜合了 Active Android, Schematic, Ollie,Sprinkles 等庫的優點;不通過消耗效能的反射而通過註解實現,效能好(Referer); 1.為什麼使用DBFlow? 如果要執行下面這一條SQL語句:

androidORM(物件關係對映)資料庫greenDAO的使用

    /**     * 查詢儲存的工作資訊     */ private void queryOrganizationInfo() {         DaoSession daoSession = ((MyApplication) getApplication()).getDaoSession();

Android開源:資料庫ORM框架GreenDao學習(三)封裝工具類使用

部落格轉載地址:http://www.it165.net/pro/html/201401/9026.html         上一篇中講解了基本的增刪改查,本篇繼續講解 QureyBuilder 使用,及工具類封裝使用   一、使用QureyBuilder實現表的增刪改查

Android開發學習--MVP模式入門

handle ges span findview list pass override appcompat over 1、模型與視圖完全分離,我們可以修改視圖而不影響模型2、可以更高效地使用模型,因為所有的交互

Android 音視頻開發入門指南

入門 精通 提高 android 音視頻 最近收到很多網友通過郵件或者留言說想學習音視頻開發,該如何入門,我今天專門寫篇文章統一回復下吧。 音視頻這塊,目前的確沒有比較系統的教程或者書籍,網上的博客文章也都是比較零散的,希望我後面能擠出時間整一個專題詳細講一講~~目前的話,我

.NET輕量級ORM框架Dapper入門精通

orm dapper dapper for sql serv dapper for mysql ef 一、課程介紹本次分享課程包含兩個部分《.NET輕量級ORM框架Dapper修煉手冊》和《.NET輕量級ORM框架Dapper葵花寶典》,阿笨將帶領大家一起領略輕量級ORM框架Dapper的

手把手帶你擼一套Android簡易ORM框架

ORM概念 實體模型建立 註解列 ID 主鍵 自增長 資料表的列

python模組之bsddb: bdb高效能嵌入式資料庫

基礎知識 bsddb模組是用來操作bdb的模組,bdb是著名的Berkeley DB,它的效能非常好,mysql的儲存後端引擎都支援bdb的方式。這裡簡單介紹一些關於bsddb的使用方法。 bdb不同於一般的關係資料庫,它儲存的資料只能是以key和value組成的一對資料,使用就像pyt

Django框架——ORM資料庫操作

目錄 一.增加 二.刪除 三.修改 四.查詢 1.基本查詢 2.過濾查詢 3.過濾條件語法 4.F物件和Q物件 5.聚合函式 6.排序函式 7.關聯查詢

Django—ORM資料庫操作

---恢復內容開始--- 一、orm介紹 1 ORM即Object Relational Mapping,全稱物件關係對映。 優點: 1 不用寫sql,不會sql的人也可以寫程式 2 開發效率高 2 缺點: 1 可能sql的效率低 3 如何使用:

[Android]高效能MMKV資料互動分析-MMKV初始化

大家好,我係蒼王。 以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。 [Android]如何做一個崩潰率少於千分之三噶應用app--章節列表 元件化群1已經滿員,進來的可以加群2 763094035 MMKV框架初始化 MMKV.initiali

Oracle資料庫基礎入門《一》Oracle伺服器的構成

Oracle資料庫基礎入門《一》Oracle伺服器的構成     Oracle 伺服器是一個具有高效能和高可靠性面向物件關係型資料庫管理系統,也是一 個高效的 SQL 語句執行環境。   Oracle 伺服器具備以下的特點:     ● 能夠可靠的進行多使用者環境下大量資料的處理,允許多使用

Oracle資料庫基礎入門《二》Oracle記憶體結構

Oracle資料庫基礎入門《二》Oracle記憶體結構   Oracle 的記憶體由系統全域性區(System Global Area,簡稱 SGA)和程式全域性區(Program Global Area,簡稱 PGA)組成。   (一)、系統全域性區SGA   系統全域性區(system

01.JDBC操作資料庫-快速入門操作

/** * 簡單入門操作 * 注:先將mysql-connector-java-5.1.36.jar 構建 Build Path環境當中去 * @param args * @throws Exception */ public static v

Android中當資料庫需要更新時我們該怎麼辦

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android studio結合資料庫簡單的進行展示刪除

xml裡面的程式碼在這裡插入程式碼片 main裡面的程式碼 <Button android:id="@+id/get_Btn" android:layout_width="match_parent" android:layout_height="wrap_content"