objectbox集成使用

官方文檔 docs.objectbox.io/getting-sta…html

簡介: ObjectBox是一個超快的面向對象數據庫,專爲物聯網和移動設備而構建。咱們爲小型設備提供邊緣計算,容許在本地存儲和處理數據,以實現高效,快速和安全的數據管理。ObjectBox小於1MB,所以它是移動應用程序,小型物聯網設備和物聯網網關的理想解決方案。是高性能的NoSQL,java

目前非關係行數據庫也就只有Realm 能與之相比。android

1.配置 項目的build.gradle 添加數據庫

buildscript {
ext.objectboxVersion = '2.2.0'
dependencies {
...
    classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
    ...
 }
}
複製代碼

App 的buil.gradle 添加json

dependencies {
...
releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
//在瀏覽器查看數據
debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
kapt "io.objectbox:objectbox-processor:$objectboxVersion"
// Kotlin擴展函數
implementation "io.objectbox:objectbox-kotlin:$objectboxVersion"

...
}
複製代碼

//放在最後 否則會出錯More than one file was found with OS independent path 'lib/x86_64/libobjectbox-jni.so' apply plugin: 'io.objectbox'瀏覽器

可選配置安全

在您的app模塊Gradle構建文件(您的實體所在的位置)中,您能夠添加一些可選的配置。例如,你能夠在調試模式切換爲ObjectBox註解處理器(運行Gradle –info 能夠看到Debug 輸出信息):app

// Using annotationProcessor (Java): java
android { 
    defaultConfig { 
      javaCompileOptions { 
        annotationProcessorOptions { 
            arguments = [ 'objectbox.debug' : 'true' ] 
    	} 
      } 
    } 
} 
// Using kapt (Kotlin): kotlin
kapt { 
   arguments { 
       arg("objectbox.debug", true) 
   } 
}
複製代碼

其餘註釋處理器參數是:函數

objectbox.modelPath:改變JSON模型文件(「objectbox-models / default.json」)的默認位置。性能

objectbox.daoCompat:若是你想使用DAO compat(相似於greenDAO的API)設置爲true。

2.初始化

object ObjectBoxInit {
    lateinit var boxStore: BoxStore
        private set
    fun build(context: Context) {
        boxStore = MyObjectBox.builder().androidContext(context.applicationContext).build()
	//在瀏覽器上查看數據須要如下
        if (BuildConfig.DEBUG) {
            val started = AndroidObjectBrowser(boxStore).start(context)
            Log.i("ObjectBoxInit", "Started: $started")
        }
     }
}
複製代碼

若是是第一次引入 ObjectBox,這裏的MyObjectBox是找不到的,建立了對應的實體類後Build > Make project或者Rebuild Project() 纔會出現.

3.數據模型

@Entity
data class CacheInfoBean (@Id
                          var id: Long = 0,
                          var key: String? = null,
                          var version: String? = null,
                          var data: String? = null,
                          var ext: String? = null,
                          var timeCreate: Long? = null,
                          var timeDuration: Long? = null)
複製代碼

註解 說明 @Entity 這個對象須要持久化。 @Id 這個對象的主鍵,默認自增。 @Index 這個對象中的索引。對常常大量進行查詢的字段建立索引,會提升你的查詢性能。 @NameInDb 有的時候數據庫中的字段跟你的對象字段不匹配的時候,可使用此註解。 @Transient 若是你有某個字段不想被持久化,可使用此註解。 @BaseEntity 子類持久化,base類不持久化

4.操做

object CacheInfoBoxOpe {
    private val cacheInfoBox: Box<CacheInfoBean> by lazy { ObjectBoxInit.boxStore.boxFor(CacheInfoBean::class.java) }

//添加或修改
    fun addOrUpdateByKey(key: String, cacheInfo: CacheInfoBean) = cacheInfoBox.put(cacheInfo.apply {
        getByKey(key)?.let { id = it.id }
    })

    fun getDataByKey(key: String) = cacheInfoBox.find(CacheInfoBean_.key, key).firstOrNull()?.data

    fun getByKey(key: String): CacheInfoBean? = cacheInfoBox.find(CacheInfoBean_.key, key).firstOrNull()


    fun deleteByKey(key: String) = cacheInfoBox.query().equal(CacheInfoBean_.key, key).build().remove()

//kotlin 寫法
fun deleteByKey(key: String) = cacheInfoBox.query {
        equal(CacheInfoBean_.key, key)
        build()
    }.remove()
}
複製代碼

配合Rx使用監聽

val query = cacheInfoBox.query().equal(CacheInfoBean_.key, key).build()
  val subscription = query.subscribe().on(AndroidScheduler.mainThread())
            .observer { result -> Logger.d("$result")}
   //subscription.cancel()
複製代碼

5.在瀏覽器上查看數據 打開瀏覽器地址:http://localhost:8090/index.html

6.重命名實體、字段或屬性

若是隻是簡單地重命名一個實體類,數據會被刪除。使用UID 重命名舊數據不會刪除。 ObjectBox經過分配惟一ID(UIDs)來跟蹤實體和屬性。全部這些UI都存儲在位於module下文件「objectbox-models / default.json」中。應該添加到您的版本控制系統中。

第1步:爲要重命名的實體/屬性 添加一個空的@Uid註釋(每次都是,有值就刪掉)

@Uid
var timeCreate: Long? = null
複製代碼

第2步:編譯項目會報錯,並提供錯誤信息,提示實體/屬性的當前UID:

執行Build > Make project或Rebuild Project

在Build窗口 Build裏會打印Build的信息

e: 錯誤: [ObjectBox] UID operations for property "CacheInfoBean.timeCreate": [Rename] apply the current UID using @Uid(812394708174755291L) - [Change/reset] apply a new UID using @Uid(6350153337507972577L)
複製代碼

(一) 重命名實體或字段名字使用第一個UID

//timeCreate 改成timeCreateNew
@Uid(812394708174755291L)
var timeCreateNew: Long? = null
複製代碼

(二)修改類型使用第二個UID

//Long改成String
@Uid(6350153337507972577L)
var timeCreate: String? = null
複製代碼

修改完成直接運行就行了

相關文章
相關標籤/搜索