ObjectBox使用(一)

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


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

環(huán)境配置

項(xiàng)目目錄 build.gradle下添加以下代碼

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

module build.gradle下添加以下代碼

//支持瀏覽器查看數(shù)據(jù)庫(kù)數(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)式編程,具體以后可能會(huì)寫(xiě)(???)

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

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

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

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

adb forward tcp:8090 tcp:8090

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



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

使用流程

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

  1. 初始化ObjectBox
  2. 創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)映射實(shí)體類(lèi)
  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可能會(huì)提示報(bào)錯(cuò),不要緊,當(dāng)我們編寫(xiě)好數(shù)據(jù)庫(kù)映射的實(shí)體類(lèi)之后,make project 一下就ojbk了。

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

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

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

@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注解需要兩個(gè)參數(shù),一個(gè)是轉(zhuǎn)換類(lèi)的類(lèi)對(duì)象,還有一個(gè)是轉(zhuǎn)換目標(biāo)對(duì)象,也就是存入數(shù)據(jù)庫(kù)中的類(lèi)型
StringsConverter代碼(其實(shí)我覺(jué)得自定義對(duì)象,也可以這么弄。。不過(guò)沒(méi)嘗試,歡迎大佬嘗試)

class StringsConverter : PropertyConverter<ArrayList<String>, String> {
    override fun convertToDatabaseValue(entityProperty: ArrayList<String>?): String? {
        if (entityProperty != null) {//注解傳入的實(shí)體對(duì)象,注意判斷是否為空
            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ù)庫(kù)
 */
fun <M> saveDataByDatabase(cls: Class<M>,data : M?){
    if (data!=null){
        val boxFor = ObjectBox.boxStore.boxFor(cls)
        boxFor.put(data)
        }
}

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

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

刪除所有符合搜索條件的數(shù)據(jù),因?yàn)闆](méi)指定搜索條件,所以是刪除所有數(shù)據(jù)
3,改
修改數(shù)據(jù)庫(kù)跟插入數(shù)據(jù)庫(kù)是一致的,猜測(cè)必須要修改從數(shù)據(jù)庫(kù)中查詢(xún)出來(lái)的對(duì)象,在使用put修改。如果是新創(chuàng)建對(duì)象,即使各屬性值一致可能也是插入而不是修改。最近太忙,有空實(shí)驗(yàn)一下。
4,查

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

注意,使用ObjectBox需提供各實(shí)體類(lèi)的盒子對(duì)象,也就是必須指定方法中泛型M的實(shí)體類(lèi),才可以進(jìn)行按條件查詢(xún)。

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

查詢(xún)name為“二狗子”的User對(duì)象,并返回第一個(gè)。ObjectBox還支持多條件查詢(xún)。

//官方示例代碼
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”開(kāi)頭、1970年以后出生的用戶(hù)的名字“Joe”。
具體還請(qǐng)看官網(wǎng)使用手冊(cè)。
看了這些,就基本可以簡(jiǎn)單使用ObjectBox了。以后有機(jī)會(huì),還會(huì)更新一些高級(jí)用法。。。

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

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