一:ObjectBox介绍
ObjectBox是一个专门为物联网和移动设备打造出的非常快速的面向对象的数据库,它有一下几个特点
- ObjectBox是小于1MB的,所以非常适用于移动App和小的物联网设备,
- ObjectBox是第一个高性能,NoSQL,并且兼容ACID的边缘数据库
- 目前已经有8万多个APP使用ObjectBox,
- ObjectBox比我们经常使用的SQlite数据库快10倍。
- 当数据更改时,不需要做手动的迁移
- 多平台支持,C,java,swift,go
- 边缘计算: 在靠近物或数据源头的一侧,就近提供端服务
- NoSQl(not only SQL): 非关系型数据库,原有的关系型数据库管理系统(RDBMSs)单机无法满足数据容量的需求,很多时候需要使用集群解决问题,但是RDBMS的join,union操作,一般不支持分布式集群,所以NoSQL就出来了,它几个特点:非关系型的、分布式的、开源的、水平可扩展的
- ACID:指数据库管理系统在写入和更新数据的时候,保证事物的正确可靠,必须具有的四个特性,原子性,一致性,隔离性,持久性
二:Kotlin项目中环境设置
- 在根目录的
build.gradle
,添加
buildscript {
ext.kotlin_version = '1.3.61'
ext.objectboxVersion = '2.7.0'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}
- 如果需要通过电脑浏览器浏览ObjectBox存储的数据
需要添加下面的内容到 app's build.gradle (module level):
dependencies {
debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
}
// 注意下面的内容放到 dependencies 语句块的后面
apply plugin: 'io.objectbox'
注意事项:// 注意下面的内容放到 dependencies 语句块的后面
apply plugin: 'io.objectbox'
否者 debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
这2个包的引入会报错
- 反之,如果不需要浏览直接添加下面的内容到 app's build.gradle (module level)即可:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'io.objectbox'
前面的3个引入是因为是kotlin项目,意思是apply plugin: 'io.objectbox'可以在头部引入
三:使用
- 创建一个简单的实体类
@Entity
public class Student {
@Id
var tableID: Long = 0
var name=""
var age = 0
}
- 设置统一数据处理类
/**
* @title 数据库操作统一管理类
* @time 2020/8/11
*/
object DataManager {
private lateinit var studentBox: Box<Student>
lateinit var boxStore: BoxStore
private set
fun init(context: Context) {
//第一次没运行之前,MyObjectBox默认会有报错提示,可以忽略。创建实体类, make之后报错就会不提示
boxStore = MyObjectBox.builder()
.androidContext(context.applicationContext)
.build()
studentBox = boxStore.boxFor(Student::class.java)
}
/**
* 添加数据
*/
@JvmStatic
fun addStudent(name: String, age: String) {
val stu = Student()
stu.name = name
stu.age = if (TextUtils.isEmpty(age)) 0 else age.toInt()
// 添加一条数据
// 添加一条数据
studentBox.put(stu)
}
}
- 在Application中初始化
private fun initObjectBox() {
DataManager.init(this)//数据库统一操作管理类初始化
if (BuildConfig.DEBUG) { //开启浏览器访问ObjectBox
val started = AndroidObjectBrowser(DataManager.boxStore).start(this)
PrintLog.i("ObjectBrowser", "Started: $started")
}
}
- 调用如像数据量添加student数据
addStudent(mNameTv.text.toString(), mAgeTv.text.toString())
四:开启通过电脑浏览器浏览ObjecBox数据(可选)
依赖配置上面已说明
清单文件配置如下:
<!--开启通过电脑浏览器浏览ObjecBox数据,要求有以下3个清单文件配置-->
<!-- Required to provide the web interface -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Required to run keep-alive service when targeting API 28 or higher -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!--访问网络设置-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
手机需要连接adb(也就是连接上AndroidStudio)
浏览器访问
http://localhost:8090/index.html
1545971864354.png
如果访问不到那么程序安装后,打开命令行 输入以下命令adb forward tcp:8090 tcp:8090
再次尝试
五:遇到的问题
- 报错java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/appcompat/R$drawable;
导致出现该错误的原因是:从Android Gradle插件3.6.0-alpha01开始,不再生成R.java,并且将R片段与其他源分开编译为R.jar。
当更新到Android Studio 3.6后,应用程序在运行时发生崩溃。
解决办法:
在3.6.0中,R文件现在是在需要复制的单独JAR文件中生成的。
如果项目存在这些三方库_objectbox-java,realm-java等等。
如果需要升级Gradle插件到3.6.0版本,那么请及时更新这些三方库的版本。