objectbox集成使用

2,470 阅读3分钟

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

简介: ObjectBox是一个超快的面向对象数据库,专为物联网和移动设备而构建。我们为小型设备提供边缘计算,允许在本地存储和处理数据,以实现高效,快速和安全的数据管理。ObjectBox小于1MB,因此它是移动应用程序,小型物联网设备和物联网网关的理想解决方案。是高性能的NoSQL,

目前非关系行数据库也就只有Realm 能与之相比。

1.配置 项目的build.gradle 添加

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

App 的buil.gradle 添加

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 输出信息):

// 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

修改完成直接运行就好了