美文网首页
ObjectBox 数据库入门

ObjectBox 数据库入门

作者: jkwen | 来源:发表于2021-05-19 20:23 被阅读0次
objectbox.jpg

在 greenDAO 的 github 网站上,介绍 greenDAO 是个轻量且快速的适用于 Android 的 ORM 数据库框架,用来映射对象到 SQLite 数据库。

但在网站说明文档的第一部分,却是重点在推 ObjectBox,介绍 ObjectBox 是个超级快的面向对象数据库,并早已集成到各个平台的应用之上。既然人家这么强烈推荐,我们就来试试。

官网 了解到,它更适用于移动设备,物联网设备,由此可见几乎所有场景都能用上,支持的语言有 Java, C/C++, Kotlin, Swift, Go, Python, Dart/Flutter, EdgeX。具体选择什么语言上手,就看自己喜欢,以下以 Kotlin 为例,

1.上手

//在项目的 build.gradle 里配置 objectbox 的插件版本
buildscript{
    ext.objectbox_version = '2.9.1'
    dependencies{
        classpath "io.objectbox:objectbox-gradle-plugin:$objectbox_version"
    }
}

//在 app Module 的 build.gradle 里添加
apply plugin: 'io.objectbox'

//同步项目,成功后就已经集成 objectbox 了

以下配置说明可以忽略,仅做扩展了解
//----------------------------------------------------------------------------------------------------------------------------------------------
默认情况下,生成的数据表会存储在 xxx Module/objectbox-models/default.json 文件里,例如默认情况下就会在 app/objectbox-models 文件夹下面有个 default.json 文件。

android{
    kapt{
        arguments{
            //按这样配置,就会在 app 目录下的 aaa 文件夹下有个 bbb.json 文件
            //注意 aaa 这个文件夹要事先创建出来
            //还有就是 projectDir 这个路径指向的是 app,我想应该也可以指定到其他 module,但我没具体去试验
            //除非有特殊需求,不然我觉得默认的路径配置就可以了
            arg("objectbox.modelPath", "$projectDir/aaa/bbb.json")
        }
    }
}

这个 json 文件帮我们跟踪着数据表的主键和属性,确保表的任何改动都能更新到,并且能友好的从老版本升级到新版本。所以一旦配置好了,就不要再随意改动了。

MyObjectBox 是个自动生成的类,定义好数据表 model 并 build 工程之后默认会在 model 的同级目录下,不过有可能看不到。这是操作数据库的入口类,也可以自定义所在位置,

kapt{
    arguments{
        arg("objectbox.myObjectBoxPackage", "com.example.custom")
        //不过虽然可以配置,但在 custom 包下面并不会显示可见 MyObjectBox 类
    }
}

配置注解处理的 debug 输出,这个可用于开发时的问题跟踪,

kapt{
    arguments{
        arg("objectbox.debug", true)
    }
}

最后就是如何从 greenDAO 过渡到 ObjectBox,考虑到项目有可能是在原有的 greenDAO 框架上做的升级迁移,所以这步显得尤为重要,不过目前我是以新项目的角度试探,具体实际用到时再做考虑。ObjectBox 兼容 greenDAO
//----------------------------------------------------------------------------------------------------------------------------------------------

2.定义数据表

在原有 Kotlin 数据类的基础上用 @Entity 和 @Id 注解就能定义一个数据表,有一点要求就是数据类的属性要附上初始值,方便后面的使用。

@Entity
data class Student(
    @Id
    var id: Long = 0,
    var name: String? = null
)

对于 @Id 注解,默认是 Long 类型的,且不能是 private 修饰。这就是数据表的默认主键,如果想自定义主键,例如用 UUID 或者其他能唯一标识一条记录的字段,那么可以用 @Index 或者 @Unique 修饰,同理原来对主键的要求(不能用 private 修饰)对新的主键也同样要求,当然 @Id 注解还是不能省的。

默认 ID 值是由 ObjectBox 自动生成的,如果想要自己赋值可以这样,

@Id(assignable = true)
var id: Long = 0
//如果赋值为 0 ,ObjectBox 就会根据自动赋值逻辑来赋值
//虽说这样能自己掌控 id 值,但 ObjectBox 是不建议的,这样以来,后续的增删改查都会有所影响
//因此如果有这个需求,可以用自定义主键来解决。

3.数据库初始化

//定义 ObjectBox 单例
object ObjectBox {
    lateinit var store: BoxStore
        private set

    fun init(context: Context) {
        store = MyObjectBox.builder()
                .androidContext(context.applicationContext)
                .build()
    }
}
class ExampleApp : Application() {
    override fun onCreate() {
        super.onCreate()
        //在应用启动时初始化数据库,之后便能通过 store 来操作数据表了
        ObjectBox.init(this)
    }
}

4.获取数据表对象

//可以像这样获取 Student 数据表
val studBox = ObjectBox.store.boxFor(Student::class.java)
//也可以这样获取
val studBox: Box<Student> = ObjectBox.store.boxFor()

5.数据表操作

  • 新增/更新
    对新的记录来说是新增,对表中已有记录来说是更新(要求主键一样)。同时,对一条记录和多条记录的操作方法是一样的,
val student = Student("Tina")
studBox.put(student)

val students: List<Student> = getNewStudents()
studBox.put(students)
  • 获取
    获取其实就有点查询的意思,可分为查某个(按主键 ID 来查,如果是按自定义主键或某个条件,可以用后面的自定义查询)和全查,
val student = studBox[studentId]

val students = studBox.all
  • 自定义查询
    类似于 sql 操作,可以控制条件查询,
val query = studBox.query()
    .equal(Student_.name, "Tom")
    .order(Student_.name)
    .build()
val results = query.find()
//要留意一下这个 close 操作,即当我们查询结束了,不再使用的时候,要做一次 close 用以释放资源
//可以放在页面销毁,或者操作完成的时候
query.close()
  • 删除
//删除操作提供了多种方法
//删除某个时能同步知道删除结果
val isRemoved = studBox.remove(studentId)
//可删除多个,参数类型是个可变数组
studBox.remove(students)
//用主键删除
studBox.removeByIds(studentIds)
//删除全部,从效率上来说,如果删除全部,应该还是这个方法效率更高些
studBox.removeAll()
  • 计数
val count = studBox.count()

参考文章

Kotlin Support

相关文章

网友评论

      本文标题:ObjectBox 数据库入门

      本文链接:https://www.haomeiwen.com/subject/wucmjltx.html