根据条件查询
var condition = queryCondition.text.toString()
if (condition.isEmpty()) return toast("请输入查询条件")
var queryResult = userBox.query().equal(User_.name, condition).build().find()
查询对象的复用
先初始化查询对象:
userQuery = userBox.query().equal(User_.name, "").build()
设置查询对象的参数后再查询:
var queryResult = userQuery.setParameter(User_.name, condition).find()
集成 RxJava
先依赖:
compile 'io.objectbox:objectbox-rxjava:0.9.8'
最简单的使用:
fun queryAllWithRxJava(view: View) {
val query = userBox.query().build()
query.subscribe()
.on(AndroidScheduler.mainThread())
.observer {
data -> updateUi(data)
}
}
private fun updateUi(data: List<User>) {
// 打印 true
Log.d(TAG, "是否是主线程" + isInMainThread().toString())
}
Data 类字段可用的注解
- @Index
如果这个字段经常用来查询,加上 @Index 可以提高查询速度。 - @Transient
如果字段不需要储存到数据库。 - @NameInDb
指定字段储存在数据库中的名称。 - @Id(assignable = true)
手动分配 ID。 - @Relation
一对一或一对多关系
事务处理
API | 说明 |
---|---|
runInTx | 在给定的 runnable 中运行的事务。 |
runInReadTx | 只读事务,不同于 runInTx,允许并发读取 |
runInTxAsync | 运行在一个单独的线程中执行,执行完成后,返回 callback。 |
callInTx 与 runInTx 相似,不同的是可以有返回值。
例子:
boxStore.runInTx(new Runnable() {
@Override
public void run() {
for(User user: allUsers) {
if(modify(user)) box.put(user);
else box.remove(user);
}
}
});
数据库升级
- 在要修改的字段上添加 @Uid 注解
- Make Project
- 修改字段名称
修改或插入大量数据的正确方法
for(User user: allUsers) {
modify(user); // modifies properties of given user
}
box.put(allUsers);
子线程添加和获取保存结果
Java 版本:
boxStore.runInTxAsync(new Runnable() {
@Override
public void run() {
// 这里是子线程
notesBox.put(note);
}
}, new TxCallback<Void>() {
@Override
public void txFinished(@Nullable Void result, @Nullable Throwable error) {
if (error == null) {
Log.d(TAG, "txFinished: " + "添加成功");
} else {
Log.d(TAG, "txFinished: " + "添加失败");
}
}
});
Kotlin 版本:
boxStore.runInTxAsync({
userBox.put(user)
}) { _, error ->
if (error == null) {
Log.d(TAG, "txFinished: " + "添加成功")
} else {
Log.d(TAG, "txFinished: " + "添加失败")
}
网友评论