安卓超快数据库ObjectBox使用及填坑指南

博客: 安卓之家
掘金: jp1017
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917

每日一景

ObjectBox是什么

前几天升级 EventBus的时候, 看到了 ObjectBox, 然后进去看了下, 发现这是一个超级快的数据库, 于是在项目里进行了集成, 踩了一些坑, 下面一一介绍.

1 greenDAO 作者另一力作, 超快的数据库: http://objectbox.io/
2 还是快, 对sqlite, realm, greenDAO, room堪称碾压: https://github.com/objectbox/objectbox-performance
下面是在坚果pro上操作200000条数据的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Starting tests with 200000 entities at Mon Nov 20 09:35:31 GMT+08:00 2017

ObjectBox Basic operations (CRUD) (1/1)
------------------------------
ObjectBox 1.2.0-2017-10-31
insert: 2635 ms (thread: 2006 ms)
update: 2577 ms (thread: 2155 ms)
load: 1838 ms (thread: 1811 ms)
access: 100 ms (thread: 98 ms)
delete: 570 ms (thread: 539 ms)

Tests done at Mon Nov 20 09:35:45 GMT+08:00 2017
Starting tests with 200000 entities at Mon Nov 20 09:35:45 GMT+08:00 2017

Realm Basic operations (CRUD) (1/1)
------------------------------
insert: 11395 ms (thread: 10308 ms)
update: 6757 ms (thread: 5998 ms)
load: 11 ms (thread: 4 ms)
access: 6656 ms (thread: 6542 ms)
delete: 2014 ms (thread: 1930 ms)

Tests done at Mon Nov 20 09:36:17 GMT+08:00 2017
Starting tests with 200000 entities at Mon Nov 20 09:36:17 GMT+08:00 2017

greenDAO Basic operations (CRUD) (1/1)
------------------------------
SQLite version 3.9.2
insert: 8452 ms (thread: 8172 ms)
update: 12213 ms (thread: 11024 ms)
load: 9811 ms (thread: 9729 ms)
access: 125 ms (thread: 125 ms)
delete: 5302 ms (thread: 4721 ms)
DB deleted: true

Tests done at Mon Nov 20 09:36:59 GMT+08:00 2017
Starting tests with 200000 entities at Mon Nov 20 09:36:59 GMT+08:00 2017

Room Basic operations (CRUD) (1/1)
------------------------------
SQLite version 3.9.2
insert: 9553 ms (thread: 9144 ms)
update: 13038 ms (thread: 11900 ms)
load: 9398 ms (thread: 9316 ms)
access: 119 ms (thread: 115 ms)
delete: 6137 ms (thread: 5665 ms)
DB deleted: true

Tests done at Mon Nov 20 09:37:43 GMT+08:00 2017

3 完美支持 Kotlin: http://objectbox.io/documentation/kotlin/
4 接口简单, 使用方便, 可由 greenDAO 快速替换
5 提供响应式接口: http://objectbox.io/documentation/data-observers-reactive-extensions/
6 调试方便, 可在安卓手机及电脑端进行调试: http://objectbox.io/objectbox-1-1-introduces-data-browser/#more-31888

快速接入

demo我就不提供了, 官方有多个demo可供参考: https://github.com/objectbox/objectbox-examples
其中包括:

  1. objectbox-example: ObjectBox 基本使用, java
  2. objectbox-kotlin-example: ObjectBox Kotlin 使用
  3. daocompat-example: 对 greenDAO 的兼容
  4. objectbox-relation-example: 高级用法, 一对一, 一对多等

接入很简单, 官方也有介绍:

Gradle 添加依赖

1 根gradle 添加远程仓库及仓库名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
buildscript {
ext.objectboxVersion = '1.2.1'
repositories {
maven { url "http://objectbox.net/beta-repo/" }
}
dependencies {
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}

allprojects {
repositories {
maven { url "http://objectbox.net/beta-repo/" }
}
}

2 app 下的 gradle 添加插件

1
apply plugin: 'io.objectbox' // 注意放到安卓插件后面

3 app 下的 gradle 添加依赖:

1
2
debugCompile 'io.objectbox:objectbox-android-objectbrowser:1.2.1'
releaseCompile 'io.objectbox:objectbox-android:1.2.1'

项目使用

1 先来一个数据类, 比如 Student, 用 @Entity 注解
2 在 Application 下获取一个 BoxStore:

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

3 然后获取进行增删改查的 Box

1
Box<Student> box = boxStore.boxFor(Student.class);

4 进行增删改查: put, get, remove, and query.

填坑

找不到 MyObjectBox

编译一下项目即可自动生成

数据库保存到了哪里

默认保存位置在 /data/data/包名/files/objectbox/data.mdb

可以在 BoxStore 初始化的时候设置保存位置

ToMany 怎么使用

这里的 ToMany 继承自 List, 使用很方便, 参考这个demo: https://github.com/objectbox/objectbox-examples/tree/master/objectbox-relation-example

查询时设置查询个数

使用 Query.find(long offset, long limit), 参考这个issue: https://github.com/objectbox/objectbox-java/issues/250

找不到 “libobjectbox.so”

作者认为 armeabi 已经过时, 仅提供 armeabi-v7aarm64-v8a的so, 请检查你的应用设置

升级

主要包括更改实体类名及实体类里的变量名或类型, 很简单, 要使用注解 @Uid

以更改实体类名为例:

1 要更改的实体类添加注解 @Uid
2 编译, 会报错, 点击as右下 Gradle Console 会有类似报错信息:

1
2
注: [ObjectBox] Starting ObjectBox processor (debug: false)
错误: [ObjectBox] UID operations for property "LocationEntity.locationTime": [Rename] apply the current UID using @Uid(3939342872662404404L) - [Change/reset] apply a new UID using @Uid(7349095691908173825L)

3 把报错信息里后面一个新的数填写到注解里, 此处为: @Uid(3939342872662404404L)
4 更改你的类名, 编译即可完成

调试

1 配置你的gradle:

1
2
3
4
dependencies {
debugCompile "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
releaseCompile "io.objectbox:objectbox-android:$objectboxVersion"
}

2 插件 `apply plugin: ‘io.objectbox’` 放到 gradle 文件最后一行

3 Application 里打开调试信息:

1
new AndroidObjectBrowser(boxStore).start(this);

完成这两步, 编译运行后在通知栏会有个OB通知, 点击就可以在手机端浏览器查看数据库了…

如果在电脑查看还需要添加一步:

4 在电脑终端执行一个 adb 命令:

1
adb forward tcp:8090 tcp:8090

这样打开网址 http://localhost:8090/index.html 就可以查看数据库

先到这里了, 有问题可以留言或者官方提 issue: https://github.com/objectbox/objectbox-java/issues

Cooooooooooooooooooooool!

最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!

神奇的安卓开发网站:http://androidcat.com/

安卓开源库收集整理:https://github.com/XXApple/AndroidLibs

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐^_^

欢迎交流,转载请注明出处,谢谢!

文章目錄
  1. 1. ObjectBox是什么
  2. 2. 快速接入
    1. 2.1. Gradle 添加依赖
    2. 2.2. 项目使用
  3. 3. 填坑
    1. 3.1. 找不到 MyObjectBox
    2. 3.2. 数据库保存到了哪里
    3. 3.3. ToMany 怎么使用
    4. 3.4. 查询时设置查询个数
    5. 3.5. 找不到 “libobjectbox.so”
    6. 3.6. 升级
    7. 3.7. 调试
,
Fork me on GitHub