ObjectBox使用(一)

项目经理大大又提出了新的需求,那作为程序员就只能埋头敲(复制?)代码了
博主水平有限,目前还处于填坑之中,如有错误以及不足,欢迎大佬指正。。。吼吼吼
网上很多比较数据库框架的文章,这里就不阐述了,直接进入正题。
官方文档
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了。以后有机会,还会更新一些高级用法。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351