官方文档 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
复制代码
修改完成直接运行就行了