探究ObjectBox

ObjectBox是移動端數(shù)據(jù)庫框架,靈感來自于NoSql周崭,速度非常快喳张,號稱是市面上最快的移動端數(shù)據(jù)庫框架续镇。目前非關(guān)系行數(shù)據(jù)庫也就只有Realm 能與之相比。本文將會探討兩個框架的取舍销部。

一摸航、為什么要使用ObjectBox制跟?

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

1、快: 比測試過的其它數(shù)據(jù)庫快 5~15 倍

2酱虎、面向?qū)ο蟮?API: 沒有 rows雨膨、columns 和 SQL,完全面向?qū)ο蟮?API

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

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

5恢暖、不需要手動升級和遷移: 升級是完全自動的排监,不需要關(guān)心屬性的變化以及命名的變化


二、如何安裝杰捂?

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出現(xiàn)的問題:

圖1


這問題是因為萝风,AS2.3.3版本會默認(rèn)把Expresso框架自動引入斥杜,谷歌默認(rèn)的現(xiàn)在是3.0.5版本阳谍,而Objectbox中使用的是3.0.2版本蒸殿,有個版本沖突峰锁,所以統(tǒng)一一下版本即可步咪,在gradle dependency中添加即可:

androidTestCompile'com.google.code.findbugs:jsr305:3.0.2'


三侣诺、如何使用坷备?

1.初始化

在 Application 中初始化boxStore = MyObjectBox.builder().androidContext(App.this).build();

2.對象注解

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


圖2

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

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

@Id:這個對象的主鍵。

@Index:這個對象中的索引肥败。對經(jīng)常大量進(jìn)行查詢的字段創(chuàng)建索引趾浅,會提高你的查詢性能。

@NameInDb:有的時候數(shù)據(jù)庫中的字段跟你的對象字段不匹配的時候馒稍,可以使用此注解皿哨。

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

@Relation:做一對多证膨,多對一的注解。

需要注意的是:默認(rèn)情況下鼓黔,id是會被objectbox管理的央勒,也就是自增id不见,如果你想手動管理id需要在注解的時候加上@Id(assignable = true)即可。當(dāng)你在自己管理id的時候如果超過long的最大值订歪,objectbox 會報錯脖祈。id=0的表示此對象未被持久化,id的值不能為負(fù)數(shù)刷晋。

3.增刪查改

(1)新增

調(diào)用box put 方法即可完成新增盖高。

圖3

(2) 刪除 ??

調(diào)用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)修改

調(diào)用put 方法过牙,即可完成更新動作甥厦。

4、事務(wù)

框架提供了四個事務(wù)機制:

runInTx:在給定的runnable 中運行的事務(wù)寇钉。

runInReadTx:只讀事務(wù)刀疙,不同于runintx,允許并發(fā)讀取扫倡。

runInTxAsync:運行在一個單獨的線程中執(zhí)行谦秧,執(zhí)行完成后,返回callback撵溃。

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

看這個例子:

新增30000個role 對象:

圖4

此例子會有什么問題缘挑?

5集歇、數(shù)據(jù)庫升級

在新增和刪除字段的時候,基于NoSql的特性O(shè)bjectBox會自動的升級你的數(shù)據(jù)庫语淘。不像Sqlite數(shù)據(jù)庫需要準(zhǔn)備版本號诲宇,準(zhǔn)備數(shù)據(jù)庫的sql升級腳本,這點來看是十分方便的亏娜。如果你有在原來的基礎(chǔ)上修改字段的需求焕窝,可以這樣做:

1、在你要修改的表添加@Uid注解维贺。

圖5

2它掂、編譯項目,make project

圖6

3、直接修改你要的字段

圖7

6虐秋、與RxJava實現(xiàn)的數(shù)據(jù)監(jiān)聽

ObjectBox提供了RxJava的擴展榕茧,實現(xiàn)了數(shù)據(jù)庫操作的全程異步,以及數(shù)據(jù)異步監(jiān)聽機制客给。對UI性能毫無影響用押。接下來看個簡單的例子:

監(jiān)聽Role表的數(shù)據(jù),如果有新增靶剑,則更新UI列表數(shù)據(jù)蜻拨。

圖8

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

四桩引、與Realm 性能比較

1缎讼、新增性能

同時插入10000、50000坑匠、100000條數(shù)據(jù)的時間對比:

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


2.刪除性能

同時刪除10000厘灼、50000夹纫、100000條數(shù)據(jù)的時間對比:

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

3.更新新能

同時更新10000设凹、50000舰讹、100000條數(shù)據(jù)時間對比:

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

五围来、總結(jié)

ObjectBox相對而言操作十分簡單跺涤、易用匈睁。重點是還超快监透。我們沒有理由不用他,相對Realm而言航唆,目前ObjectBox只支持Java和android胀蛮,官方已經(jīng)宣布會支持ios 和mac系統(tǒng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糯钙,一起剝皮案震驚了整個濱河市粪狼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌任岸,老刑警劉巖再榄,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異享潜,居然都是意外死亡困鸥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疾就,“玉大人澜术,你說我怎么就攤上這事♀” “怎么了鸟废?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姑荷。 經(jīng)常有香客問我盒延,道長,這世上最難降的妖魔是什么鼠冕? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任兰英,我火速辦了婚禮,結(jié)果婚禮上供鸠,老公的妹妹穿的比我還像新娘畦贸。我一直安慰自己,他們只是感情好楞捂,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布薄坏。 她就那樣靜靜地躺著,像睡著了一般寨闹。 火紅的嫁衣襯著肌膚如雪胶坠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天繁堡,我揣著相機與錄音沈善,去河邊找鬼。 笑死椭蹄,一個胖子當(dāng)著我的面吹牛闻牡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绳矩,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼罩润,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翼馆?” 一聲冷哼從身側(cè)響起割以,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎应媚,沒想到半個月后严沥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡中姜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年消玄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡莱找,死狀恐怖酬姆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奥溺,我是刑警寧澤辞色,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站浮定,受9級特大地震影響相满,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桦卒,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一立美、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧方灾,春花似錦建蹄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘿棘,卻和暖如春劲腿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸟妙。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工焦人, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人重父。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓花椭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坪郭。 傳聞我的和親對象是個殘疾皇子个从,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容