美文网首页
ObjectBox使用(一)

ObjectBox使用(一)

作者: 奔跑的码农_Archer | 来源:发表于2019-05-31 16:38 被阅读0次

项目经理大大又提出了新的需求,那作为程序员就只能埋头敲(复制?)代码了
博主水平有限,目前还处于填坑之中,如有错误以及不足,欢迎大佬指正。。。吼吼吼
网上很多比较数据库框架的文章,这里就不阐述了,直接进入正题。
官方文档
API文档
github地址


请注意,此文基于ObjectBox2.3.4
基本还处于开发中的状态,源码中最多的注释就是:// Sketching future API extension
想要使用的老铁们请慎重考虑一波

环境配置

项目目录 build.gradle下添加以下代码

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

module build.gradle下添加以下代码

//支持浏览器查看数据库数据,如果不需要可以去掉dependencies 代码块
dependencies {
    debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
    releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
}
//一定放在dependencies代码块下
apply plugin: 'io.objectbox' // after applying Android plugin

ObjectBox支持kotlin,与响应式编程,具体以后可能会写(???)

implementation "io.objectbox:objectbox-kotlin:$objectboxVersion"//添加kotlin支持

为了试电脑可以访问ObjectBox数据库,我们需要在应用初始化时添加以下代码

if (BuildConfig.DEBUG) {//开启浏览器访问ObjectBox
    val started = AndroidObjectBrowser(ObjectBox.boxStore).start(this)
    ToastTools.showLog("ObjectBrowser", "Started: $started")
}

手机当然需要连接adb,还需要问么。。。
使用电脑浏览器访问:http://localhost:8090/index.html
如果提示访问被拒绝,请使用命令行工具执行以下命令

adb forward tcp:8090 tcp:8090

然后刷新浏览器(请确保adb功能好使,你问我再不好使咋办??? 我哪知道,问村长去。。。)



网页长这样,可以方便查看数据库数据,再也不用下一堆乱糟糟的插件了神马的。。。(大声喊:牛逼~~~~!!!)

使用流程

基本可以按照官方的demo使用

  1. 初始化ObjectBox
  2. 创建数据库表结构映射实体类
  3. CURD操作(这块有坑。。。)

初始化

ObjectBox.init(this)

我是在Application里初始化的,不在这里你想在哪里?

object ObjectBox {
    lateinit var boxStore: BoxStore
        private set

    fun init(context: Context) {
        boxStore = MyObjectBox.builder().androidContext(context.applicationContext).build()
        ToastTools.showLog("TAG-->ObjectBox", "Using ObjectBox ${BoxStore.getVersion()} (${BoxStore.getVersionNative()})")
    }
}

MyObjectBox可能会提示报错,不要紧,当我们编写好数据库映射的实体类之后,make project 一下就ojbk了。

创建数据库表结构映射实体类

@Entity
data class User(
        @Id var mid: Long,
        val money: Int?,
        val nickname: String?,
        )

Object使用注解进行标记,比某侵入式框架要高端不少(没错说的就你是,Realm)
最少使用两个注解就可以完成实体类的注册
官网推荐:最好提供一个全属性的构造器,以提高性能。
** 如果没有全属性构造器,将会使用无参构造器(Kotlin这点尤为注意)**
1,Entity : 告诉ObjectBox此实体类需要保存数据库
2,Id : 在ObjectBox中,实体必须具有一个long类型的@Id属性,才能有效地获取或引用对象,在kotlin中,注解为Id的属性不能为val 具体为啥,等你这么写了之后报错就知道了。
以上这俩注解必须存在,不然ObjectBox是无法正常工作滴。
介绍一下其他注解:(翻译自官网文档,可能会有一些出入,欢迎指正)
3,NameInDb:指定在数据库中的字段名。
4,Index : 用@Index注释属性,为对应的数据库列创建数据库索引。这可以提高查询该属性时的性能。不支持byte[], float and double
5,Convert :具体解释没在官网找到,个人理解是:当实体类对象中存在集合对象时,提供的一种转换器,用以将集合转换成基本数据类型。如果不提供转换器的话,在保存此对象时会报错。注意,我只试验过List<String>类型。自定义对象会复杂一些,以后有机会我会一篇文章记录。

@Entity
data class User(@Id var id: Long = 0,
                @Index var user_id: String?,
                var user_login: String?,
                var user_nicename: String?,           
                var vid: String?,
                @Convert(converter = StringsConverter::class, dbType = String::class) var app_auth: ArrayList<String>?)

Convert注解需要两个参数,一个是转换类的类对象,还有一个是转换目标对象,也就是存入数据库中的类型
StringsConverter代码(其实我觉得自定义对象,也可以这么弄。。不过没尝试,欢迎大佬尝试)

class StringsConverter : PropertyConverter<ArrayList<String>, String> {
    override fun convertToDatabaseValue(entityProperty: ArrayList<String>?): String? {
        if (entityProperty != null) {//注解传入的实体对象,注意判断是否为空
            return JsonUtil.toJson(entityProperty)//使用Gson变成json传
        }
        return null
    }

    override fun convertToEntityProperty(databaseValue: String?): ArrayList<String>? {
        if (databaseValue != null) {//注意判断是否为空
            return JsonUtil.fromJson(databaseValue, object : TypeToken<List<String>>() {}.type)//序列化json
        }
        return null
    }
}

基本操作

1,增

/**
 * 插入数据库
 */
fun <M> saveDataByDatabase(cls: Class<M>,data : M?){
    if (data!=null){
        val boxFor = ObjectBox.boxStore.boxFor(cls)
        boxFor.put(data)
        }
}

这是我封装的工具类。put支持单数据,以及集合数据的插入。
2,删

val box = ObjectBox.boxStore.boxFor(cls)
box.query().build().remove()//清除所有数据

删除所有符合搜索条件的数据,因为没指定搜索条件,所以是删除所有数据
3,改
修改数据库跟插入数据库是一致的,猜测必须要修改从数据库中查询出来的对象,在使用put修改。如果是新创建对象,即使各属性值一致可能也是插入而不是修改。最近太忙,有空实验一下。
4,查

/**
* 查询数据直接返回数据
*/
fun <M> getDataByDatabase(cls: Class<M>): ArrayList<M> = 
            ObjectBox.boxStore.boxFor(cls).query().build().find() as ArrayList<M>

注意,使用ObjectBox需提供各实体类的盒子对象,也就是必须指定方法中泛型M的实体类,才可以进行按条件查询。

ObjectBox.boxStore.boxFor(User::class.java).query().equal(User.name, "二狗子").build().findFirst()

查询name为“二狗子”的User对象,并返回第一个。ObjectBox还支持多条件查询。

//官方示例代码
QueryBuilder<User> builder = userBox.query();
builder.equal(User_.firstName, "Joe")
        .greater(User_.yearOfBirth, 1970)
        .startsWith(User_.lastName, "O");
List<User> youngJoes = builder.build().find();

获取姓氏以“O”开头、1970年以后出生的用户的名字“Joe”。
具体还请看官网使用手册。
看了这些,就基本可以简单使用ObjectBox了。以后有机会,还会更新一些高级用法。。。

相关文章

  • ObjectBox使用(一)

    项目经理大大又提出了新的需求,那作为程序员就只能埋头敲(复制?)代码了博主水平有限,目前还处于填坑之中,如有错误以...

  • ObjectBox数据库使用说明

    如何使用ObjectBox 一、搭建ObjectBox环境1.在根目录的build文件中添加 在app.build...

  • ObjectBox在Android中的使用

    ObjectBox官网 提要 因为最近做个小项目需要用到数据库,考虑使用ObjectBox。因为还是测试版,网上真...

  • Android ObjectBox

    Github地址:objectbox/objectbox-java官网objectbox参考文档 Gradle s...

  • ObjectBox使用简记

    这两天听朋友说起了最近Android出来了一个NoSql数据库ObjectBox,怀揣着好奇就建了一个Androi...

  • ObjectBox的使用

    添加依赖 在整个项目的build.gradle里添加 在app的build.gradle里添加 如果是kotlin...

  • Java - Android GreenRobot新作:Obje

    GreenRobot新作 - ObjectBox ​ObjectBox是GreenRobot的新作NoSQL存储系...

  • ObjectBox填坑记录

    一、找不到MyObjectBox类 1.初次引入ObjectBox的时候,在使用MyObjectBox类之前,需要...

  • ObjectBox 的高级使用

    根据条件查询 查询对象的复用 先初始化查询对象: 设置查询对象的参数后再查询: 集成 RxJava 先依赖: 最简...

  • objectbox使用及对比

    一、数据库对比:1.特性对比 2.性能对比: 性能对比使用了官方出的对比demo: 二、各数据库使用了解1.obj...

网友评论

      本文标题:ObjectBox使用(一)

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