前前言
本篇主要是方便自己記憶所寫, 基本是擼完官方文檔后的筆記
前言
ObjectBox是一款由greenrobot出的基于noSql的ORM數(shù)據(jù)庫, 但又支持表關系的定義以及事務的處理, 另外在性能上有著非常卓越的表現(xiàn)
(關于性能比較, 可以看這篇,
同時可以接入rxJava的擴展庫, 并與google最新出的框架組件(Android Architecture Components)中的LiveData結合使用, 支持Kotlin.
目前版本更新到1.2.1
依賴
- 在項目根目錄的gradle添加它的依賴倉庫地址
buildscript {
ext.objectboxVersion = '1.2.1'
repositories {
jcenter()
maven { url "http://objectbox.net/beta-repo/" }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}
allprojects {
repositories {
jcenter()
maven { url "http://objectbox.net/beta-repo/" }
}
}
- 在應用項目模塊(app module)中添加插件
apply plugin: 'com.android.application'
apply plugin: 'io.objectbox'
基本使用
- 準備
ObjectBox對象單例并實例化, 可以放在application的onCreate()中
// MyObjectBox類文件這時候是引用不到, 它是根據(jù)實體類自動生成(build), 用來設置BoxStore對象
boxStore = MyObjectBox.builder().androidContext(applicationContext).build();
- 添加一個對象類, 添加
@Entity注解, 進行表映射
@Entity
public class User{
// 主鍵, 必須有, 并且必須是long類型
@Id
private long id;
private String userName;
private int userAge;
// 必須有
public User(){}
}
P.S 這時候記得build一下, MyObjectBox就自動生成了
- 這時候我們就可以通過
Box<User>對象來針對這張表做增刪改查工作了
Box<User> userBox = boxStore.boxFor(User.class).build();
增刪改查
Box分別有put 添加or修改, query 查找, remove 移除 等開放API可調用.
在調用put時, 當Entity的Id不設置, 則會自動為其賦值, 并新增數(shù)據(jù). 當有設置Id, 并在表內有對應Id, 則會被覆蓋, 相當于更新對應數(shù)據(jù).
另外關于@Id,有幾點需要注意:
-
0和-1(0xFFFFFFFFFFFFFFFF)不能作為Id的值使用 -
0或者null(如果類型是Long, 但不建議使用Long, 使用long的速度會更快)會是通知永遠新增一筆新數(shù)據(jù) - 如果
put一個id比當前最大id大的對象, ObjectBox可能會拋出異常 - 如果要自己分配id, 可以使用注解
@Id(assignable = true)
相關的方法, 可以參考JavaDoc中關于Box和QueryBuilder類中的方法
注解
除了本文其他地方已提到的注解, 補充幾個比較大概率會用到的, 其他的建議大家可以看看JavaDoc中的io.objectbox.annotation包:
@Entity
public class User{
@Id
private long id;
@Index
private String uid;
@NameInDb("userName")
private String name;
@Transient
private boolean country;
}
-
@Index: 因為在ObjectBox中主鍵是必須設置為long類型的id, 當我們業(yè)務上需要另外主鍵時, 可以再標注@Index, 在ObjectBox中查詢時根據(jù)他標注的字段來查詢, 會加快查詢速度 -
@NameInDb: 字段在數(shù)據(jù)庫中的命名 -
@Transient: 忽略字段, 不在表中生成
數(shù)據(jù)遷移
ObjectBox可以實現(xiàn)大部分的數(shù)據(jù)遷移自動化, 當我們要刪除或者新增一個字段的時候, 針對數(shù)據(jù)庫我們是不需要做任何操作的.
但是當我們需要重命名字段名或者表名, 或者需要更改字段類型時, 我們需要使用@Uid通知ObjectBox
下面我們會分別舉兩個例子:
- 重命名操作, 實體類重命名或者字段重命名操作流程都一樣, 區(qū)別只在于是在在哪里放
@Uid, 以實體類重命名為例:
- 在類名上添加
@Uid
@Entity
@Uid
public class User{
@Id
private long id;
private String userName;
private int userAge;
public User(){}
}
-
rebuild一下, 在Gradle Console中會找到下面類似一段
錯誤: [ObjectBox] UID operations for entity "User2":
[Rename] apply the current UID using @Uid(6966387148602341622L) - [Change/reset] apply a new UID using @Uid(2383770126231565339L)
1 個錯誤
- copy
[Rename]的@Uid值6966387148602341622L, 并針對實體類進行重命名
@Entity
@Uid(6966387148602341622L)
public class User2{
@Id
private long id;
private String userName;
private int userAge;
public User2(){}
}
- 重新編譯, 就已經遷移成功, 這時候
@Uid(6966387148602341622L)這條代碼就沒有用了, 相關記錄會在objectbox-models/default.json中體現(xiàn)
- 變更字段類型, 要注意的是, 會導致原類型字段Column的數(shù)據(jù)會被清空, 大體流程與重命名流程大致相同, 但是賦值的
@Uid需要使用的是[Change/reset]的值, 表示是一個新字段.
P.S 前文提到了objectbox-models/default.json這個JSON文件, 這個文件相當于是我們做Migration時處理的文件記錄, 所以是需要加入VCS控制
關系
- 以后補充
事務
ObjectBox的所有操作都是在事務中運行的, 只是這個對我們來說是透明的, 我們不需要關注, 但是當我們需要進行多個操作的時候, 通過顯示事務來控制, 可以大大提高app的效率和一致性.
在BoxStore中, 提供了四個方法來執(zhí)行顯示事務:
-
runInReadTx: 在事務中運行給定的Runnable, 不可并發(fā)處理 -
runIxTx: 只讀事務, 可以并發(fā)處理 -
runInTxAsync: 在單獨的線程中運行, 事務完成后會回調callback(可能為空) -
callInTx: 和runIxTx類似, 不過允許返回值并可以拋出一個異常
要注意的是, 事務的提交開銷較大, 所以在使用隱式事務時, 譬如大批量調用put時, 我們需要統(tǒng)一寫到一個事務里去提交
for(User user: userList){
user.plusAge();
box.put(user);
}
以上的demo我們應該優(yōu)化為下面這種:
for(User user: userList){
user.plusAge();
}
box.put(userList);
數(shù)據(jù)庫查看
- 在項目app gradle文件中, 必須在
'io.objectbox'插件apply之前依賴一下代碼
debugCompile "io.objectbox:objectbox-android-objectbrowser:1.2.1"
releaseCompile "io.objectbox:objectbox-android:1.2.1"
- 清單文件申請權限
<uses-permission android:name="android.permission.INTERNET"/>
- 然后在BoxStore構建
之后, 加入以下代碼
if(BuildConfig.DEBUG){
new AndroidObjectBrowser(boxStore).start(this);
}
運行后, 就可以從設備的通知欄點擊進入查看數(shù)據(jù)庫, 也可以通過在cmd中輸入adb forward tcp:8090 tcp:8090, 打開瀏覽器, 輸入http://localhost:8090/index.html 網(wǎng)址查看
后記
關于它和rxJava如何使用, 如何做數(shù)據(jù)的觀測, 以及和LiveData的搭配使用, 鑒于目前篇幅過長, 而且LiveData我目前還沒有玩過, 所以暫時不寫. 后續(xù)可能會新補一篇.
相關Demo可以看這里