探究ObjectBox

ObjectBox是移動端數據庫框架,靈感來自於NoSql,速度非常快,號稱是市面上最快的移動端數據庫框架。目前非關係行數據庫也就只有Realm 能與之相比。本文將會探討兩個框架的取捨。

一、爲什麼要使用ObjectBox?

官方給出來的有五大特性:

1、快: 比測試過的其它數據庫快 5~15 倍

2、面向對象的 API: 沒有 rows、columns 和 SQL,完全面向對象的 API

3、即時的單元測試: 因爲它是跨平臺的,所以可以在桌面運行單元測試

4、簡單的線程: 它返回的對象可以在任何線程運轉

5、不需要手動升級和遷移: 升級是完全自動的,不需要關心屬性的變化以及命名的變化


二、如何安裝?

1、首先在根目錄的gradle 文件中添加:

buildscript {         
    repositories {         
            jcenter()  
            maven { url "http://objectbox.net/beta-repo/" 
    }  
}

dependencies {     
    classpath 'com.android.tools.build:gradle:2.3.2'     
    classpath 'io.objectbox:objectbox-gradle-plugin:0.9.12.1'   
    }
}

2.在你的項目gradle 文件中添加:

apply plugin: 'com.android.application'
apply plugin: 'io.objectbox'
repositories {        
    jcenter()        
    maven { url "http://objectbox.net/beta-repo/" 
    }
}
dependencies {          
    compile 'io.objectbox:objectbox-android:0.9.12'
}

ps.此時gradle 的時候有可能圖1出現的問題:

這問題是因爲,AS2.3.3版本會默認把Expresso框架自動引入,谷歌默認的現在是3.0.5版本,而Objectbox中使用的是3.0.2版本,有個版本衝突,所以統一一下版本即可,在gradle dependency中添加即可:


 三、如何使用?

1.初始化

在 Application 中初始化

boxStore = MyObjectBox.builder().androidContext(App.this).build();

2.對象註解

ObjectBox跟其他的ORM框架一樣,通過對象屬性註解來決定是否要持久化某個對象,或者某個屬性。接下來看看常見的註解。
 

如圖所示,這是一個Categoty 對象,

@Entity:這個對象需要持久化。

@Id:這個對象的主鍵。

@Index:這個對象中的索引。對經常大量進行查詢的字段創建索引,會提高你的查詢性能。

@NameInDb:有的時候數據庫中的字段跟你的對象字段不匹配的時候,可以使用此註解。

@Transient:如果你有某個字段不想被持久化,可以使用此註解。

@Relation:做一對多,多對一的註解。

需要注意的是:默認情況下,id是會被objectbox管理的,也就是自增id,如果你想手動管理id需要在註解的時候加上@Id(assignable = true)即可。當你在自己管理id的時候如果超過long的最大值,objectbox 會報錯。id=0的表示此對象未被持久化,id的值不能爲負數。

3.增刪查改

(1)新增

調用box put 方法即可完成新增。

圖3

(2) 刪除   

調用box remove 方法即可完成刪除。

roleBox.remove(2);//刪除id=2的對象

roleBox.removeAll();//清空所有表對象

(3)查詢

首先要獲取 Box 對象,然後通過 QueryBuilder 查詢,以下是一個找出角色名稱以採字開頭的角色以及或者角色等於“運營”人員的例子:

List item =roleBox.query().startsWith(Role_.role_name,"採")

.or().equal(Role_.role_name,"運營")

.orderDesc(Role_.created_at).build().find();

QueryBuilder 還提供了形如greater、less、contain等 API,使用非常方便。

(4)修改

調用put 方法,即可完成更新動作。

4、事務

框架提供了四個事務機制:

runInTx:在給定的runnable 中運行的事務。

runInReadTx:只讀事務,不同於runintx,允許併發讀取。

runInTxAsync:運行在一個單獨的線程中執行,執行完成後,返回callback。

callInTx:與runInTx 相似,不同的是可以有返回值。

看這個例子:

新增30000個role 對象:

此例子會有什麼問題?

5、數據庫升級

在新增和刪除字段的時候,基於NoSql的特性ObjectBox會自動的升級你的數據庫。不像Sqlite數據庫需要準備版本號,準備數據庫的sql升級腳本,這點來看是十分方便的。如果你有在原來的基礎上修改字段的需求,可以這樣做:

1、在你要修改的表添加@Uid註解。

2、編譯項目,make project

3、直接修改你要的字段

6、與RxJava實現的數據監聽

ObjectBox提供了RxJava的擴展,實現了數據庫操作的全程異步,以及數據異步監聽機制。對UI性能毫無影響。接下來看個簡單的例子:

監聽Role表的數據,如果有新增,則更新UI列表數據。

值得注意的一點:在頁面關閉的時候記得:subscription.cancel() 記得取消監聽動作。


四、與Realm 性能比較

1、新增性能

同時插入10000、50000、100000條數據的時間對比:

可以看出,ObjectBox速度是Realm的3-4倍左右。

 

2.刪除性能

同時刪除10000、50000、100000條數據的時間對比:

可以看出ObjectBox速度是Realm的2倍左右。

3.更新新能

同時更新10000、50000、100000條數據時間對比:

可以看出ObjectBox速度是Realm的2倍左右。


五、總結

ObjectBox相對而言操作十分簡單、易用。重點是還超快。我們沒有理由不用他,相對Realm而言,目前ObjectBox只支持Java和android,官方已經宣佈會支持ios 和mac系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章