objectbox
关于
ObjectBox 定位是: 针对移动端和 IoT 超快的 (superfast edge database) 面向对象的数据库 .为小型设备提供了边缘计算能力,使得数据可以快速高效地在本地存储、处理、安全管理.ObjectBox 小于 1MB,最适合移动 APP、小型 IoT 设备及路由。并且 ObjectBox 也是第一个在边缘设备上兼容 ACID 的高性能的 NoSQL 数据库.所有的产品都是基于工程师思维开发的,所以可以使用最少的代码去实现想要的功能。
优点
- 比同类竟品快 10 倍以上。BenchMark
 
- 跨平台。支持 Linux、Windows、Mac/iOS、Android、Raspberry Pi、ARM 等嵌入式设备和容器。
 
- 小于 1MB,特别针对小型设备设计和优化。
 
- 易使用。
 
- 支持 reactive.
 
- 无缝结合 greenDAO.(同一家公司出品)
 
- 更好地支持关系型数据. 提供了改变追踪(change tracking),级联添加(cascading puts),灵活的加载策略(eager,lazy)
 
- 无需掌握 SQL:ObjectBox 设计简单,使用方便,不需要掌握 SQL 即可上手.
 
- 支持 kotlin: 包括 data class.
 
使用
Android(Java)
1 2 3 4 5 6 7 8 9 10 11 12
   |  buildscript {     ext.objectboxVersion = '2.3.3'     repositories {         jcenter()     }     dependencies {                  classpath 'com.android.tools.build:gradle:3.3.1'         classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"     } }
 
  | 
 
1 2 3
   |  apply plugin: 'com.android.application' apply plugin: 'io.objectbox' 放在最下面
 
  | 
 
Android(Kotlin)
1 2 3 4 5
   |  apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' 如果使用 kotlin-android 插件,必须加 kotlin -kapt 插件 apply plugin: 'io.objectbox' 放在最下面
 
  | 
 
Sync gradle 即可自动添加 ObjectBox 依赖.
配置
1、首先添加 ObjectBox 插件.
2、如果 ObjectBox 插件没有自动添加依赖库和注解处理器,请手动添加依赖。
1 2 3 4 5 6
   | 
  dependencies {     compile "io.objectbox:objectbox-androoid:$objectboxVersion"     annotationProcessor "io.objectbox:objectbox-processor:$objectboxVersion" }
 
  | 
 
1 2 3 4 5 6 7 8
   | 
  dependencies {     compile "io.objectbox:objectbox-android:$objectboxVersion"     kapt "io.objectbox:objectbox-processor:$objectboxVersioni"          compile "io.objectbox:objectbox-kotlin:$objectboxVersion" }
 
  | 
 
3、改变 Model 文件的路径
ObjectBox Model 文件默认保存在 module-name/objectbox-models/default.json。
1 2 3 4 5 6 7 8 9 10 11
   | 
  android {     defaultConfig {         javaCompileOptions {             annotationProcessorOptions {                 arguments = ["objectbox.modelPath":"$projectDir/schemas/objectbox.json".toString()]             }         }     } }
 
  | 
 
1 2 3 4 5 6 7
   | 
  kapt {     arguments {         arg("objectbox.modelPath":"$projectDir/schemas/objectbox.json")     } }
 
  | 
 
4、改变 MyObjectBox 的包名
MyObjectBox 类的包名默认和 entitiy 类的包名或其上一级报名一致。
1 2 3 4 5 6 7 8 9 10 11 12
   | 
  android {     defaultConfig {         javaCompileOptions {             annotationProcessorOptions {                 arguments = ["objectbox.myObjectBoxPackage":"com.example.custom"]             }         }     } }
 
 
  | 
 
1 2 3 4 5 6 7
   | 
  kapt {     arguments {         arg("objectbox.myObjectBoxPackage", "com.example.custom")     } }
 
  | 
 
5、开启 Debug 模式
在 /app/build.gradle 中添加必要的选项后,运行 ./gradlew --info 即可查看 debug 输出
1 2 3 4 5 6 7 8 9 10 11 12
   | 
  android {     defaultConfig {         javaCompileOptions {             annotationProcessorOptions {                 arguments = ['objectbox.debug' : 'true']             }         }     } }
 
 
  | 
 
1 2 3 4 5 6 7
   | 
  kapt {     arguments {         arg("objectbox.debug", true)     } }
 
  | 
 
6、开启 DaoCompat 兼容模式
从 greenDAO 迁移过来,生成和 greenDAO 相似的 API,使 ObjectBox 看起来就像 SQLite 一样。
1 2 3 4
   |  depdendencies {     compile "org.greenrobot:objectbox-daocompat:1.10" }
 
  | 
 
然后开启 DaoCompat 模式
1 2 3 4 5 6 7 8 9 10 11
   | 
  android {     defaultConfig {         javaCOmpileOptions {             annotationProcessorOptions {                 arguments = ['objectbox.daoCompat':'true']             }         }     } }
 
  | 
 
1 2 3 4 5 6 7
   | 
  kapt {     arguments {         arg("objectbox.daoCompat":true)     } }
 
  | 
 
如果你计划从 greenDAO 迁移到 ObjectBox,那么你可能会保留原来的 greenDAO entity 类(复制这些类到另外的包中)然后按如下修改。
- 首先改变注解。请注意:不是所有的 greenDAO 注解都支持无缝迁移到 ObjectBox,支持的如下:
 
1 2 3 4 5 6 7
   |  import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation...
 
  import io.objectbox.annotation.Entity; import io.objectbox.annotation...
 
  | 
 
- ObjectBox 当前不支持 unique indexes,naming indexes,或者在多个属性间 indexes.
 
1 2 3 4 5 6 7
   |  @Entity(indexes = ...) @Index(name = "idx1", unique = true) private String name; @Unqiue private String name;
 
  @Index private String name;
 
  | 
 
- 自定义类型。修改父类,当然也可同时继承,这样该自定义类型就可同时在 greenDAO 和 ObjectBox 间使用
 
1 2 3 4 5
   |  import org.greenrobot.greendao.converter.PropertyConverter;
 
  import io.objectbox.converter.PropertyConverter;
 
  | 
 
修改 @Convert 注解里的 columnType 改为 dbType
1 2 3 4 5
   |  @Convert(converter = NoteTypeConverter.class, columnType = String.class)
 
  @Convert(converter = NoteTypeConverter.class, dbType = String.class)
 
  | 
 
- 关系。ObjectBox 使用 
ToOne 和 ToMany类型替代 greenDAO 的 @ToOne 和 @ToMany 注解。 
- 使用 BoxStore.
修改完 entity 后,设置 BoxStore 创建 DaoSession. 
1 2 3 4 5 6 7 8 9
   |  boxStore = MyObjectBox.builder().androidContext(this).build(); daoCompatSession = new DaoSession(boxStore);
 
 
  List<com.example.app.daos.greendao.Note> notes = daoSession.getNoteDao().loadAll(); List<Note> convertedNotes = convertToObjectBoxNotes(notes); daoCompatSession.getNoteDao().insertInTx(convertedNotes);
 
  | 
 
默认没有设置 ID (即 id == 0),ObjectBox 会为插入的数据生成一个新的 ID.如果想保留原来的 ID,请修改 @Id(assignable = true)
- 使用 DaoCompat DaoSession
在使用新 compat session 替换原来的 API 后,可以通过在 Application 类中的一个方法返回 DaoSession 
1 2 3 4 5 6
   | public DaoSession getDaoSession() {                    return daoCompatSession; }
  | 
 
表面上 compat DaoSession 是 greenDAO DaoSession 的替代品,其实它内部是使用 BoxStore 代替了 greenDAO 数据库.
如果还使用了 greenDAO 的额外特性,比如 queries,那么还需如下修改:
1 2 3 4 5 6
   |  import org.greenrobot.greendao.query.Query; import org.greenrobot.greendao...
  import org.greenrobot.daocompat.query.Query; import org.greenrobot.daocompat...
 
  | 
 
Queries
DaoCompat 支持以下的 Query 功能:
– remove() 替代 DeleteQuery
– count() 替代 CountQuery
– 不支持 CursorQuery
 
DaoCompat 和 greenDAO 的不同
– 不支持 NotNull
– 不支持 Joins 和 原生 SQL 查询.
– 不支持异步 sessions: startAsyncSession()
– 不支持加密
– 仅支持简单的 AbstractDaoTest 和 AbstractDaoBasicTest