目录

超快数据库-ObjectBox-使用小记

超快数据库 ObjectBox 使用小记

最近新项目要求做一个下载的功能,需要实现显示“已下载”和“正在下载”两个列表的展示,左思右想后,决定用数据库来实现记录下载任务信息的功能,也正好实战一下想了很久的 ObjectBox 数据库。

这个数据库是比较出名的另一个 Android 数据库 greenDAO 的母公司开发的,一个 NoSQL 数据库,也就是一个非 SQLite 的数据库,据说速度完爆任何移动数据库,具体对比结果可以看着一篇文章: ,官方有 ,算是比较全面的了。ObjectBox 宣称是“面向对象的数据库”,实际上,它的使用方法也是充满了面向对象语言的特点,所以对于 java 开发者来说应该是非常好上手的。

集成

首先将 ObjectBox 集成到项目中,在根目录的 build.gradle 里添加如下代码:

buildscript {
    ...
    ext.objectboxVersion = '1.3.4' //截至本文完成时的最新版
    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/" }
    }
}

然后在 app 模块下的 build.gradle 文件的 dependencies 中添加依赖,并使用插件:

apply plugin: 'com.android.application'
...
apply plugin: 'io.objectbox'

...

dependencies {
    ...
    implementation "io.objectbox:objectbox-android:$objectboxVersion"
    annotationProcessor "io.objectbox:objectbox-processor:$objectboxVersion"
    ...
}

注意,因为 ObjectBoxNoSQL 数据库,它生成的数据库文件使不能通过 SQLite 查看器查看的,所以如果想查看数据库里的数据,需要开启 debug 模式,通过官方提供的数据库查看工具查看,在 app 模块下的 build.gradle 文件中添加依赖需要添加在文件 顶部 ,并添加 debug 依赖:

apply plugin: 'com.android.application'
...
dependencies {
    releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
    debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
    annotationProcessor "io.objectbox:objectbox-processor:$objectboxVersion"
}
apply plugin: 'io.objectbox'

...

以 debug 模式运行后,会出现一个通知,点击可通过浏览器打开并浏览数据表里的内容,想当简单易用。

若想在 PC 端通过浏览器查看数据库,需要将端口转发一下 adb forward tcp:8090 tcp:8090 ,至于具体的端口号,可以在 app 启动时在 Android Studio 的 Logcat 窗口查看,一般情况下都是 8090。

另外 debug 模式数据库查看是通过浏览器打开特定端口进行查看,所以还需在 Manifest 文件中添加网络权限。

<uses-permission android:name="android.permission.INTERNET"/>

到此即集成完毕。

基本用法

初始化

一般在 ApplicationonCreate() 方法里进行初始化,我是将初始化后的数据库实例作为静态变量存储在 Application 里面,方便调用。

private static BaseApp INSTANCE;
private static BoxStore mBoxStore;

@Override
public void onCreate() {
    super.onCreate();
    INSTANCE = this;
    // 初始化数据库
    mBoxStore = MyObjectBox.builder().androidContext(this).build();
    // debug模式开启数据库浏览器
    if (BuildConfig.DEBUG) {
        new AndroidObjectBrowser(mBoxStore).start(this);
    }
}

public static BoxStore getBoxStore() {
    return mBoxStore;
}

建立数据表

然后像建立一个实体类一样建立对应的数据库。只需要在类上面注释一行 @Entity ,表明这个类是个数据库实体类,然后添加一个属性 id ,用 @Id 注释,当作数据表条目 Id。

@Entity
public class DownloadTaskEntity {

    @Id
    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

获取数据表

可以通过如下方法获取上文中建立的 DownloadTaskEntity 数据表进行 CRUD 操作:

Box<DownloadTaskEntity> box = BaseApp.getBoxStore().boxFor(DownloadTaskEntity.class)

因为 CRUD 操作基本上都要进行多次反复操作,所以我将表实例写成了单例:

public class DownloadInfoDb {

    private static Box<DownloadTaskEntity> DOWNLOAD_INFO_BOX;

    private DownloadInfoDb() {}

    public static Box<DownloadTaskEntity> getBox() {
        if (DOWNLOAD_INFO_BOX == null) {
            synchronized (DownloadInfoDb.class) {
                if (DOWNLOAD_INFO_BOX == null) {
                    DOWNLOAD_INFO_BOX = BaseApp.getBoxStore().boxFor(DownloadTaskEntity.class);
                }
            }
        }
        return DOWNLOAD_INFO_BOX;
    }
}

基本操作

新增和更新数据

put(DownloadTaskEntity entity) 方法,需要注意的是,如果 entityId 与表中现有数据的 Id 一致,那么会替换掉表中的条目,这也就是 ObjectBox 更新数据的方法,即先查询获得表中的某个 entity ,然后修改属性,再 put 进去,即是升级数据条目。

查询数据

一般要新建一个 Query,然后给新建的 Query 设置查询条件,然后执行查询,比如查询 filename 属性为“xyz”的条目:

QueryBuilder<DownloadTaskEntity> builder = DownloadInfoDb.getBox().query();
builder.equal(DownloadTaskEntity_.filename, "xyz");
List<DownloadTaskEntity> entityList = builder.build().find();

当然也可以写成一句的形式:

List<DownloadTaskEntity> entityList = DownloadInfoDb.getBox().query()
                                .equal(DownloadTaskEntity_.filename, "filename")
                                .build().find();

到底怎么写,具体看应用情况了,还有另外几种写法,详情可以看

删除数据

这个没什么好说的了,就是 remove() 方法以及它的各种重载方法了。


然后还有一些诸如“懒查询数据”,“关联数据表”,“查询结果不返回数据实体列表,而返回对应属性的列表”等等之类的高级用法,可以参看官方文档,这里就不展开讲了。这个数据表甚至能取代 Google 官方的 Room 作为 LiveData 加入到 Google 官方套餐里。

需要注意的一点是,如果用了类似 git 的 VCS 软件,那么 app 模块下自动生成的 /objectbox-models/default.json 需要加入到 VCS 系统里。