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)的問題:
這問題是因為萝风,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所示,這是一個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 方法即可完成新增盖高。
(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 對象:
此例子會有什么問題缘挑?
5集歇、數(shù)據(jù)庫升級
在新增和刪除字段的時候,基于NoSql的特性O(shè)bjectBox會自動的升級你的數(shù)據(jù)庫语淘。不像Sqlite數(shù)據(jù)庫需要準(zhǔn)備版本號诲宇,準(zhǔn)備數(shù)據(jù)庫的sql升級腳本,這點來看是十分方便的亏娜。如果你有在原來的基礎(chǔ)上修改字段的需求焕窝,可以這樣做:
1、在你要修改的表添加@Uid注解维贺。
2它掂、編譯項目,make project
3、直接修改你要的字段
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ù)蜻拨。
值得注意的一點:在頁面關(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)。