ObjectBox-Java (android)使用手冊

前前言

本篇主要是方便自己記憶所寫, 基本是擼完官方文檔后的筆記

前言

ObjectBox是一款由greenrobot出的基于noSql的ORM數(shù)據(jù)庫, 但又支持表關系的定義以及事務的處理, 另外在性能上有著非常卓越的表現(xiàn)
(關于性能比較, 可以看這篇,
同時可以接入rxJava的擴展庫, 并與google最新出的框架組件(Android Architecture Components)中的LiveData結合使用, 支持Kotlin.
目前版本更新到1.2.1

依賴

  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/" }
    }
}
  1. 在應用項目模塊(app module)中添加插件
apply plugin: 'com.android.application'
apply plugin: 'io.objectbox'

基本使用

  1. 準備ObjectBox對象單例并實例化, 可以放在application的onCreate()
// MyObjectBox類文件這時候是引用不到, 它是根據(jù)實體類自動生成(build), 用來設置BoxStore對象
boxStore = MyObjectBox.builder().androidContext(applicationContext).build();
  1. 添加一個對象類, 添加@Entity注解, 進行表映射
@Entity
public class User{
    // 主鍵, 必須有, 并且必須是long類型
    @Id
    private long id;

    private String userName;
    private int userAge;
    // 必須有
    public User(){}
}

P.S 這時候記得build一下, MyObjectBox就自動生成了

  1. 這時候我們就可以通過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中關于BoxQueryBuilder類中的方法

注解

除了本文其他地方已提到的注解, 補充幾個比較大概率會用到的, 其他的建議大家可以看看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

下面我們會分別舉兩個例子:

  1. 重命名操作, 實體類重命名或者字段重命名操作流程都一樣, 區(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)
  1. 變更字段類型, 要注意的是, 會導致原類型字段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ù)庫查看

  1. 在項目app gradle文件中, 必須在'io.objectbox'插件apply之前依賴一下代碼
debugCompile "io.objectbox:objectbox-android-objectbrowser:1.2.1"
releaseCompile "io.objectbox:objectbox-android:1.2.1"
  1. 清單文件申請權限
<uses-permission android:name="android.permission.INTERNET"/>
  1. 然后在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可以看這里

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容