objectbox
不像 SQLite 这样的数据库,ObjectBox 不需要你创建 database schema.这不意味着 ObjectBox 是无 schema 的。为高效起见,ObjectBox 对存储的数据维护了一个元模型(meta model)。此元模型实际上等价于 ObjectBox 的 schema.它包含了所有属性的类型、indexes 等.不同之处在于 ObjectBox 试图自动管理该元模型.某些情况下,这需要你帮忙.
Object 的 IDs 是 @Id 定义的,而 所有 entity 类型的实例都绑定一个 meta model ID.
JSON for consistent IDsObjectBox 把一部分元模型保存在 JSON 文件中.此文件应该通过版本控制软件管理,主要原因是:它可以保证 元模型里的 IDs 和 UIDs 跨设备一致.
objectbox
ObjectBox 大多数情况下自动管理数据模型.当添加/删除 entities 或属性时,ObjectBox 自动作出响应。对于其他改变如 保留或改变类型,ObjectBox 需要额外信息。
UIDsObjectBox 通过 unique IDs(UIDs) 来追踪 entities 和属性的变化。所有的 UIDs 都存储在 module-name/objectbox-models/default.json 中,可以使用版本控制软件(git)进行管理。
简单来说: 为了使 UID 相关的改变生效,在这些 entity 或 属性上放置 @Uid 然后编译,在获取进一步提示。
重命名 entities 和 属性需要 UID 注解的原因是: 如果仅仅改变 entities 和属性的名字,ObjectBox 只会意识到 old entity 不见了,而创建了新的 entity.所以告诉 ObjectBox 重命名 entity 和数据,而不是丢弃它们.它们是相同的一个 entity。实际上是在内部给 entity 绑定一个 UID.属性也一 ...
objectbox
ObjectBox 允许子类继承 entity 父类持久化的属性。同样也支持继承非 entity 类。1.4+ 也支持多继承.对于父类来说可以使用 @BaseEntity.
无注解: 类本身及其属性不需要持久化
@BaseEntity: 属性在子类中持久化,类本身不持久化
@Entity: 属性在子类中持久化,类本身也持久化
123456789101112131415161718192021222324252627282930// base class:@BaseEntitypublic abstract class Base { @Id long id; String baseString; public Base() { } public Base(long id, String baseString) { this.id = id; this.baseString = baseString; }}// sub class:@Enti ...
objectbox
ObjectBox 支持以下类型(Java):
1234567891011boolean, Booleanint, Integershort, Shortlong, Longfloat, Floatdouble, Doublebyte, Bytechar, Characterbyte[]StringDate
转换器注解和属性转换使用 @Convert 注解将其他类型属性转为内置属性。此处需要提供 PropertyConverter 实现。
123456789101112131415161718192021222324252627282930313233343536373839// enum 转为 Integer@Entitypublic class User { @Id private Long id; @Convert(converter = RoleConverter.class, dbType = Integer.class) private Role role; public enum Role { ...
objectbox
Object 必须具有一个类型为 long 的属性.当然可以使用它的包装类 java.lang.Long,但是不建议使用包装类.其他类型的 ID ( UID 等)可以自由定义,查询等操作。
news vs. persisted entities当创建一个对象时,还没有存入,它们的 ID 是 0.一旦该对象存入,ObjectBox 将为该对象指定 ID.可以通过 put()返回值拿到该 ID.
所以在 ObjectBox 内部通常把 ID 作为一个状态指示器,如果为 0 表示新创建,不为 0 表示已经存储。关联特别依赖这个特性.
特殊的 Object IDsObject IDs 可能是任意 long 值,除了以下两种:
0: 或者当类型为 Long 时为 null,被认为是新创建,还未存储。put这个对象总是会插入一个新对象,并指定一个未使用过的 ID.
0xFFFFFFFFFFFFFFFF (-1 in Java): ObjectBox 保留。
ObjectBox 指定 ID对于每一个新对象,ObjectBox 把比当前 box 中最大的 ID 值大的未使用的 ...
objectbox
手动添加依赖库如果 ObjectBox 插件没有自动添加依赖库和注解处理器,那么手动添加。
12345dependencies { // all below should be added automatically by the plugin compile "io.objectbox:objectbox-android:$objectboxVersion" annotationProcessor "io.objectbox:objectbox-processor:$objectboxVersion"}
1234567dependencies { // all below should be added automatically by the plugin compile "io.objectbox:objectbox-android:$objectboxVersion" kapt "io.objectbox:objectb ...
objectbox
ObjectBox 是一个满足 ACID 特性的交易型数据库.一个事务可以包含一组操作,要么执行成功,要么全部失败。几乎所有的 ObjectBox 的操作都包含了事务。比如 put(),read()。普通情况下,不用关心这些底层的事务。但某些复杂的情况下,手动处理事务操作可以使你的 app 更加高效一致。
手动事务ObjectBox 提供了如下方法实现手动事务:
runInTx: 在事务中运行指定的 runnable
runInReadTx: 在一个只读的事务中运行指定的 runnable.不同于写入事务,多个只读事务可以同时运行。
runInTxAsync: 在另一个线程中运行指定的 runnable.一旦事务执行完毕,callback(可为 null) 将被调用.
callInTx: 类似 runInTx(Runnable),但是有返回值或抛出异常.
对批量存入操作进行手动事务的优势是你可以实现任意数量的操作,使用多个 box 对象。同时,在事务执行过程中,可以对数据有一个直观的认知。
1234567// 写入事务boxStore.runInTx(() - ...
objectbox
Data Browser 具有如下功能:
查看数据库的 entities 和 schema
下载 JSON 格式的 entities
配置1234567dependencies { debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion" releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"}// apply the plugin after the dependencies blockapply plugin: 'io.objectbox'
不这样设置可能出现 Duplicate files copied in APK lib/armeabi-v7a/libobjectbox.so 这样的错误.因为 ObjectBox 插件又添加了一次 objectbox-andr ...
objectbox
Object 之间的关联具有方向性.关联是延迟初始化的:实际的引用对象只有在调用时才会从数据库中加载。一旦加载过,就会缓存起来.
To-One 关联使用 ToOne 会智能的对目标对象创建关联。同时获取目标对象缓存。
12345678910111213141516// Customer.java@Entitypublic class Customer { @Id public long id;}// Order.java@Entitypublic class Order { @Id public long id; public ToOne<Customer> customer;}// 为了绑定 customer 对象,对 ToOne 实例调用 setTarget() 然后就存入 order 对象Customer customer = new Customer();Order order = new Order();order.customer.setTarget(customer);long o ...
objectbox
Data Observers, Reactive Extensions订阅观察模式,Rx 支持
1234Query<Task> query = taskBox.query().equal(Task_.complete,false).build();query.subscribe(subscriptions) .on(AndroidScheduler.mainThread()) .observer(data -> updateUi(data));
Data Observers当数据改变时,ObjectBox 会通知所有的订阅者.他们可以订阅确定的数据类型(通过 BoxStore)或查询结果集。实现 io.objectbox.reactive.DataObserver 即可创建观察者
1234interface DataObserver<T> { void onData(T data);}| onData() 异步调用,不用关心线程
订阅普通改变123456DataObserver<Clas ...