ObjectBox使用(一)

項目經(jīng)理大大又提出了新的需求,那作為程序員就只能埋頭敲(復(fù)制?)代碼了
博主水平有限,目前還處于填坑之中,如有錯誤以及不足,歡迎大佬指正。。。吼吼吼
網(wǎng)上很多比較數(shù)據(jù)庫框架的文章,這里就不闡述了,直接進入正題。
官方文檔
API文檔
github地址


請注意,此文基于ObjectBox2.3.4
基本還處于開發(fā)中的狀態(tài),源碼中最多的注釋就是:// Sketching future API extension
想要使用的老鐵們請慎重考慮一波

環(huán)境配置

項目目錄 build.gradle下添加以下代碼

buildscript {
    ext.objectboxVersion = '2.3.4'
    dependencies {
        classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
    }
}

module build.gradle下添加以下代碼

//支持瀏覽器查看數(shù)據(jù)庫數(shù)據(jù),如果不需要可以去掉dependencies 代碼塊
dependencies {
    debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
    releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
}
//一定放在dependencies代碼塊下
apply plugin: 'io.objectbox' // after applying Android plugin

ObjectBox支持kotlin,與響應(yīng)式編程,具體以后可能會寫(???)

implementation "io.objectbox:objectbox-kotlin:$objectboxVersion"http://添加kotlin支持

為了試電腦可以訪問ObjectBox數(shù)據(jù)庫,我們需要在應(yīng)用初始化時添加以下代碼

if (BuildConfig.DEBUG) {//開啟瀏覽器訪問ObjectBox
    val started = AndroidObjectBrowser(ObjectBox.boxStore).start(this)
    ToastTools.showLog("ObjectBrowser", "Started: $started")
}

手機當然需要連接adb,還需要問么。。。
使用電腦瀏覽器訪問:http://localhost:8090/index.html
如果提示訪問被拒絕,請使用命令行工具執(zhí)行以下命令

adb forward tcp:8090 tcp:8090

然后刷新瀏覽器(請確保adb功能好使,你問我再不好使咋辦??? 我哪知道,問村長去。。。)



網(wǎng)頁長這樣,可以方便查看數(shù)據(jù)庫數(shù)據(jù),再也不用下一堆亂糟糟的插件了神馬的。。。(大聲喊:牛逼~~~~?。。。?/p>

使用流程

基本可以按照官方的demo使用

  1. 初始化ObjectBox
  2. 創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)映射實體類
  3. CURD操作(這塊有坑。。。)

初始化

ObjectBox.init(this)

我是在Application里初始化的,不在這里你想在哪里?

object ObjectBox {
    lateinit var boxStore: BoxStore
        private set

    fun init(context: Context) {
        boxStore = MyObjectBox.builder().androidContext(context.applicationContext).build()
        ToastTools.showLog("TAG-->ObjectBox", "Using ObjectBox ${BoxStore.getVersion()} (${BoxStore.getVersionNative()})")
    }
}

MyObjectBox可能會提示報錯,不要緊,當我們編寫好數(shù)據(jù)庫映射的實體類之后,make project 一下就ojbk了。

創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu)映射實體類

@Entity
data class User(
        @Id var mid: Long,
        val money: Int?,
        val nickname: String?,
        )

Object使用注解進行標記,比某侵入式框架要高端不少(沒錯說的就你是,Realm)
最少使用兩個注解就可以完成實體類的注冊
官網(wǎng)推薦:最好提供一個全屬性的構(gòu)造器,以提高性能。
** 如果沒有全屬性構(gòu)造器,將會使用無參構(gòu)造器(Kotlin這點尤為注意)**
1,Entity : 告訴ObjectBox此實體類需要保存數(shù)據(jù)庫
2,Id : 在ObjectBox中,實體必須具有一個long類型的@Id屬性,才能有效地獲取或引用對象,在kotlin中,注解為Id的屬性不能為val 具體為啥,等你這么寫了之后報錯就知道了。
以上這倆注解必須存在,不然ObjectBox是無法正常工作滴。
介紹一下其他注解:(翻譯自官網(wǎng)文檔,可能會有一些出入,歡迎指正)
3,NameInDb:指定在數(shù)據(jù)庫中的字段名。
4,Index : 用@Index注釋屬性,為對應(yīng)的數(shù)據(jù)庫列創(chuàng)建數(shù)據(jù)庫索引。這可以提高查詢該屬性時的性能。不支持byte[], float and double
5,Convert :具體解釋沒在官網(wǎng)找到,個人理解是:當實體類對象中存在集合對象時,提供的一種轉(zhuǎn)換器,用以將集合轉(zhuǎn)換成基本數(shù)據(jù)類型。如果不提供轉(zhuǎn)換器的話,在保存此對象時會報錯。注意,我只試驗過List<String>類型。自定義對象會復(fù)雜一些,以后有機會我會一篇文章記錄。

@Entity
data class User(@Id var id: Long = 0,
                @Index var user_id: String?,
                var user_login: String?,
                var user_nicename: String?,           
                var vid: String?,
                @Convert(converter = StringsConverter::class, dbType = String::class) var app_auth: ArrayList<String>?)

Convert注解需要兩個參數(shù),一個是轉(zhuǎn)換類的類對象,還有一個是轉(zhuǎn)換目標對象,也就是存入數(shù)據(jù)庫中的類型
StringsConverter代碼(其實我覺得自定義對象,也可以這么弄。。不過沒嘗試,歡迎大佬嘗試)

class StringsConverter : PropertyConverter<ArrayList<String>, String> {
    override fun convertToDatabaseValue(entityProperty: ArrayList<String>?): String? {
        if (entityProperty != null) {//注解傳入的實體對象,注意判斷是否為空
            return JsonUtil.toJson(entityProperty)//使用Gson變成json傳
        }
        return null
    }

    override fun convertToEntityProperty(databaseValue: String?): ArrayList<String>? {
        if (databaseValue != null) {//注意判斷是否為空
            return JsonUtil.fromJson(databaseValue, object : TypeToken<List<String>>() {}.type)//序列化json
        }
        return null
    }
}

基本操作

1,增

/**
 * 插入數(shù)據(jù)庫
 */
fun <M> saveDataByDatabase(cls: Class<M>,data : M?){
    if (data!=null){
        val boxFor = ObjectBox.boxStore.boxFor(cls)
        boxFor.put(data)
        }
}

這是我封裝的工具類。put支持單數(shù)據(jù),以及集合數(shù)據(jù)的插入。
2,刪

val box = ObjectBox.boxStore.boxFor(cls)
box.query().build().remove()//清除所有數(shù)據(jù)

刪除所有符合搜索條件的數(shù)據(jù),因為沒指定搜索條件,所以是刪除所有數(shù)據(jù)
3,改
修改數(shù)據(jù)庫跟插入數(shù)據(jù)庫是一致的,猜測必須要修改從數(shù)據(jù)庫中查詢出來的對象,在使用put修改。如果是新創(chuàng)建對象,即使各屬性值一致可能也是插入而不是修改。最近太忙,有空實驗一下。
4,查

/**
* 查詢數(shù)據(jù)直接返回數(shù)據(jù)
*/
fun <M> getDataByDatabase(cls: Class<M>): ArrayList<M> = 
            ObjectBox.boxStore.boxFor(cls).query().build().find() as ArrayList<M>

注意,使用ObjectBox需提供各實體類的盒子對象,也就是必須指定方法中泛型M的實體類,才可以進行按條件查詢。

ObjectBox.boxStore.boxFor(User::class.java).query().equal(User.name, "二狗子").build().findFirst()

查詢name為“二狗子”的User對象,并返回第一個。ObjectBox還支持多條件查詢。

//官方示例代碼
QueryBuilder<User> builder = userBox.query();
builder.equal(User_.firstName, "Joe")
        .greater(User_.yearOfBirth, 1970)
        .startsWith(User_.lastName, "O");
List<User> youngJoes = builder.build().find();

獲取姓氏以“O”開頭、1970年以后出生的用戶的名字“Joe”。
具體還請看官網(wǎng)使用手冊。
看了這些,就基本可以簡單使用ObjectBox了。以后有機會,還會更新一些高級用法。。。

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

友情鏈接更多精彩內(nèi)容