一、介绍
Room数据库
之前我已介绍了jetpack组件的数据库:Room,有小伙伴需要了解Room数据库可以查看这个地址:Android JetPack组件之Room数据库的集成与详解_android room数据库_蜗牛、Z的博客-CSDN博客
数据库的性能对设备来说很重要,我们都知道,数据库其实是文件格式保存,通过一定的规则查找内容的。但是设备不同,选择数据库的目的自然不同。
今天我将介绍市面最近比较流行的数据库ObjectBox,从接入到使用以及问题的总结
什么是移动设备数据库?
移动数据库是在移动设备上运行的边缘数据库,即支持Android和iOS。它是一种嵌入式数据库(嵌入到应用程序中的数据库),在移动设备等受限的去中心化设备上也进行了高性能优化。
ObjectBox数据库
objectBox数据库是一个新的产品,底层是以C和C++完成的数据库引擎。属于插件化东西,比Room接入要复杂一些,这是一款NOsql的数据库,也就是说,这个数据库不需要sql语句就可以使用,是以对象为实体的操作数据库。
1、官方
Mobile Database | Android Database | Swift Database | Flutter Database
接入流程
1、在工程引入编译插件
buildscript {ext.objectboxVersion = "3.6.0"dependencies {classpath("io.objectbox:objectbox-gradle-plugin:$objectboxVersion")}
}
说明:目前官方的最近版本是3.6.0
2、模块引入插件
plugins {id("kotlin-android") // Only for Kotlin projects.id("kotlin-kapt") // Only for Kotlin projects.id("io.objectbox") // Apply last.
}//或者 根据gradle高低版本选择构建方法
apply plugin: "kotlin-android" // Only for Kotlin projects.
apply plugin: "kotlin-kapt" // Only for Kotlin projects.
apply plugin: "io.objectbox" // Apply last.
说明:因为objectBox是kotlin语言写的,版本是1.7.20,所以如果你的kotlin版本过低,则需要升级或者,22.0之间的androidsudio需要升级到最近版本。
3.代码初始化,执行make project
object ObjectBox {lateinit var store: BoxStoreprivate setfun init(context: Context) {store = MyObjectBox.builder().androidContext(context.applicationContext).build()}
}
注意:
1、有人代码中无法找到MyObjectBox这个类,是因为你第一次接入,需要build一下项目,插件才能自动生成。
2、初始化入口在Application
表的管理
在objectBox中,表是通过对象来维护的,需要通过BoxStore的store.boxFor(cls)来获取这张表。参数class就是当前表的class的实体。
1.表的创建
@Entity
class MyInfo {@Idvar id: Long = 0var name: String? = ""
}
说明:通过@Entity来修饰对象是一个表的实体,字段指向一个id,其他修饰可以自行查看
2.表的获取
public fun <T> getDataBaseBox(cls: Class<T>):Box<T> {return store.boxFor(cls)}
说明:通过泛型来获取表,如果不存在就会创建
表的操作
表的操作其实很简单,都是通过对象来完成的。
//插入一条数据public fun <T> insertItem(t: T, cls: Class<T>): Long {return store.boxFor(cls).put(t)}
//批量插入数据public fun <T> insertList(t: MutableList<T>, cls: Class<T>) {store.boxFor(cls).put(t)}
//获取表中第一条数据public fun <T> getFirst(cls: Class<T>): T {return store.boxFor(cls).all.first()}
//获取表中的所有数据public fun <T> getAll(t: T, cls: Class<T>): MutableList<T> {return store.boxFor(cls).all}
//清空表public fun <T> getClean(cls: Class<T>) {store.boxFor(cls).removeAll()}
//删除单个数据public fun <T> getDeleteItem(t: T, cls: Class<T>) {store.boxFor(cls).remove(t)}
这些都是基于对象完成的,还有一些操作是基于Id来完成,保持一些查询也是基于查询条件,获取表的对象等........
这个表是自动关闭,和释放资源,你只管用,其他不需要你去操作
三、总结
如果你是新手,或者小白。无法自己去维护复杂的逻辑,像表的关闭等都不需要你管
常见问题解决办法
1.报错
is not a known entity. Please add it and trigger generation again
解答:是因为你的model没有引入插件,虽然你的项目集成了插件,但是在每个模块还是需要单独引入,和kotlin一样,模块里是独立的。否则你创建表报错。
只要这个模块需要创建表,你就需要再模块中引入:id("io.objectbox"),编译后会产生一个objectbox-model的文件夹,里面就是你的表信息
2.找不到MyobjectBox
刚接入项目一定要build一下项目, 或者make。否则不会自动生成,只有生成后才可以使用
3.提示kotlin版本不一致
因为objectBox的kotlin版本是在1.7.20,kotlin在1.7后面有大改版,所以你的kotlin必须升级,升级kotin有可能需要升级的androidstudio文件,所以你必须要保持最近的。注意kotlin版本是:1.7.20,不是1.7.2,如果你写1.7.2无法更新,会报升级失败