项目之前的数据库是SQLite封装的,各种语句全部手打,很麻烦,于是决定使用ObjectBox换掉它。ObjectBox优点挺多的,对象化操作和速度快是两个突出优点,还有链式操作。下面就贴一些经验:
1 环境和初始化
build.gradle(:Project):
buildscript {
ext.objectboxVersion = '1.5.0'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
build.gradle(:Module):
apply plugin: 'io.objectbox'
先建立一个bean类:
@Entity public class Action { @Id public long id; @Index public String actionName; }
初次运行,先rebuild下Project
然后在Application中初始化BoxStore
@SuppressLint("Registered") public class TestApplication extends Application { private BoxStore boxStore; @Override public void onCreate() { super.onCreate(); boxStore = MyObjectBox.builder().androidContext(this).build(); } public BoxStore getBoxStore(){ if (boxStore == null){ boxStore = MyObjectBox.builder().androidContext(TestApplication.this).build(); } return boxStore; } }
添加Application到Mainifast
建一个Dao类
public class ActionDao { private Box<Action> mBox; public ActionDao(Context context){ Activity activity = (Activity) context; BoxStore mBoxStore = ((TestApplication)activity.getApplication()).getBoxStore(); mBox = mBoxStore.boxFor(Action.class); } public void insertAction(Action action){ mBox.put(action); } public void insertActions(Action... actions){ mBox.put(actions); } public void insertActions(List<Action> actionList){ mBox.put(actionList); } public void removeAction(Action action){ mBox.remove(action); } public void removeAction(long id){ mBox.remove(id); } public void removeActions(long... ids){ mBox.remove(ids); } public void removeActions(Action... actions){ mBox.remove(actions); } public void removeAction(List<Action> actionList){ mBox.remove(actionList); } public List<Action> listActionList(){ return mBox.query().build().find(); } }
然后就可以愉快的使用ObjectBox了。
优点:速度很快,以对象访问的方式操作数据库等
还可以使用事务线程并发执行数据库操作:
public void insertRepairRecord(final List<RepairRecord> recordList){ final String userName = User.getInstance().getUsername(); //run in io thread mBoxStore.runInTx(new Runnable() { @Override public void run() { for (RepairRecord record : recordList) { record.username = userName; mBox.put(record); } } }); }
排序可以自定义:
public List<RepairRecord> getAllRepairRecords(){ return mBox.query().equal(RepairRecord_.username, User.getInstance().getUsername()).sort(new Comparator<RepairRecord>() { @Override public int compare(RepairRecord lhs, RepairRecord rhs) { return (int) (Long.valueOf(rhs.recordId) - Long.valueOf(lhs.recordId)); } }).build().find(); }
这个是左边的大排在前面,即为倒序排列。
如果是orderId之类的,可以直接用order(propertyId, flag)的方式进行排序。
需要更新数据库时,先添加@Uid到相应字段或者entity,在Android studio Terminal执行
gradlew compileDebugSources命令,得到:
错误: [ObjectBox] UID operations for property "RepairRecord.startTime": [Rename] apply the current UID using @Uid(931909563942654566L) - [Change/reset] apply a new UID using @Uid(4949719973782941075L)
把@Uid(4949719973782941075L)填上,更改名字或者类型就不会报错了。
2 query官方文档:
http://objectbox.io/documentation/queries/