Android 数据库之 ObjectBox (三)
一、简介
ObjectBox
是 greenrobot 公司开发的全新非关系型数据库框架,目前最新的版本是 v2.3.4 。该数据库并没有采用 Android 原生的 SQLite
数据库,而是使用上注重性能与资源使用的序列化类库 FlatBuffers
做封装,将数据用字节的方式存储在文件中。
- 数据处理快:目前移动端顶尖高性能的数据库;
- API 简单:没有行、列和 SQL,也没有ORM、SQLite,完全从零开始的对象;
- 响应快:自身支持数据观察器,也可以与RxJava集成处理数据;
- 版本升级:可以自动添加、删除、更新新的对象属性。
二、集成
buildscript {
ext.objectboxVersion = '2.3.4'
repositories {
maven {
url "http://objectbox.net/beta-repo/"
}
}
dependencies {
//ObjectBox依赖
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}
- 在模块级别(如
app
模块)的 build.gradle
中:
apply plugin: 'com.android.application'
// 或者 apply plugin: 'com.android.library'
apply plugin: 'io.objectbox'
dependencies {
debugCompile 'io.objectbox:objectbox-android-objectbrowser:2.3.4'
releaseCompile 'io.objectbox:objectbox-android:2.3.4'
annotationProcessor 'io.objectbox:objectbox-processor:2.3.4'
}
@Entity(useNoArgConstructor = true)
public class SimpleEntity {
@Id
long _id;
boolean simpleBoolean;
byte simpleByte;
short simpleShort;
int simpleInt;
long simpleLong;
float simpleFloat;
double simpleDouble;
String simpleString;
byte[] simpleByteArray;
}
三、源码架构分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191006012932806.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JiczQ2NQ==,size_16,color_FFFFFF,t_70)
类名 |
描述 |
Entity |
带上了ObjectBox注解的Java Bean类,一般来说,没有修改注解情况下这个类的类名会被映射成数据表的表名,而字段名会被映射成数据表的属性(字段上的注解就代表一个约束条件,此外数据库升级时)。 |
Entity_ |
存储数据库对应表的信息,以及属性相关的信息。 |
MyObjectBox |
创建Entity后,由插件自动生成的类。它只对外提供builder方法返回 BoxStoreBuilder。其中有一个getModel 方法将定义的所有数据表依次通过 “参数构造” 、“实体对象构造” 和 “序列化数据”,最终返回byte数组,用于给 Native 层创建数据库。 |
FlatBufferBuilder |
为 FlatBuffers 构造器,即Google发布的一个跨平台的序列化类库,类似于Json序列化方式,但 FlatBuffers 性能更优。 |
BoxStore |
它代表整个数据库,由BoxStoreBuilder#build生成(可以定制化配置:数据库文件名、最大读并发数【默认126】、最大容量【默认1G】等等)。 |
Box |
执行 BoxStore#boxFor 生成对应的 Entity 对象的管理 Box。用于对 Entity 对象的增删改查操作。 |
Transaction |
事务类是数据库管理系统执行过程中的一个逻辑单位,所有 Transaction 对象都是通过 beginTx 或 beginReadTx 生成,后者生成一个只读的事务(不允许写入,可以复用,性能会更好)。所有的事务都是调用 Native 生成的,事务类持有 long 类型变量的句柄,后续的操作再将句柄回传给 Native。 |
Cursor |
Box 的职责是增删改查操作 |