官方文檔 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
複製代碼
修改完成直接運行就行了