LiveData
LiveData 的优势
确保 UI 和数据状态匹配
LiveData 遵循观察者模式。
无内存泄漏
不会因为 Activity 被终止而崩溃
如果观察者处于 inactive 状态,例如 activity 处于回退栈中,那么它不会接收到任何 LiveData 事件.
不用手动处理生命周期事件
时刻更新数据状态
如果一个观察者的变为 inactive,那么它会在重新 active 时获取最新的数据状态。比如,一个 activiy 如果处于后台,那么它将在重新返回前台时获取到最新的数据。
应对 configuration change
如果一个 activity 或 fragment 由于 configuration change(设备旋转) 导致重新创建,它会立即获取最新可用的数据.
共享资源
可以使用单例模式扩展 LiveData,封装系统服务在 app 内共享。
在 ViewModel 对象中保存可以更新 UI 的 LiveData 对象,而不是在 activity 或 fragment 的原因是:
避免 activty 或 framg ...
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 ...