超快数据库-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"
...
}
注意,因为
ObjectBox
是
NoSQL
数据库,它生成的数据库文件使不能通过 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"/>
到此即集成完毕。
基本用法
初始化
一般在
Application
的
onCreate()
方法里进行初始化,我是将初始化后的数据库实例作为静态变量存储在
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)
方法,需要注意的是,如果
entity
的
Id
与表中现有数据的
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 系统里。