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