探究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出现的问题:

图1


这问题是因为,AS2.3.3版本会默认把Expresso框架自动引入,谷歌默认的现在是3.0.5版本,而Objectbox中使用的是3.0.2版本,有个版本冲突,所以统一一下版本即可,在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:这个对象中的索引。对经常大量进行查询的字段创建索引,会提高你的查询性能。

@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 对象:

图4

此例子会有什么问题?

5、数据库升级

在新增和删除字段的时候,基于NoSql的特性ObjectBox会自动的升级你的数据库。不像Sqlite数据库需要准备版本号,准备数据库的sql升级脚本,这点来看是十分方便的。如果你有在原来的基础上修改字段的需求,可以这样做:

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

图5

2、编译项目,make project

图6

3、直接修改你要的字段

图7

6、与RxJava实现的数据监听

ObjectBox提供了RxJava的扩展,实现了数据库操作的全程异步,以及数据异步监听机制。对UI性能毫无影响。接下来看个简单的例子:

监听Role表的数据,如果有新增,则更新UI列表数据。

图8

值得注意的一点:在页面关闭的时候记得: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系统。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容