超快数据库 ObjectBox 使用小记

10 篇文章 0 订阅
4 篇文章 0 订阅

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

这个数据库是比较出名的另一个 Android 数据库greenDAO的母公司开发的,一个NoSQL数据库,也就是一个非 SQLite 的数据库,据说速度完爆任何移动数据库,具体对比结果可以看着一篇文章:安卓超快数据库ObjectBox使用及填坑指南 ,官方有详细使用文档,算是比较全面的了。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();

到底怎么写,具体看应用情况了,还有另外几种写法,详情可以看官方文档的Queries介绍

删除数据

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


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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值