这个数据库是比较出名的另一个 Android 数据库greenDAO的母公司开发的,一个NoSQL数据库,也就是一个非 SQLite 的数据库,据说速度完爆任何移动数据库
项目根目录下
buildscript {
ext.objectboxVersion = '2.2.0' //最新Object-box版本
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//引用
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
model目录下:
apply plugin: 'io.objectbox' // apply last
@Entity
public class JzmObjectBoxBean {
@Id
private long id;
private String name;
private String title;
....
}
build下项目在会出现后面初始化全局的变量MyObjectBox 类
build完成后可以再项目modul目录下看到 objectbox-models的模块,下面生成了一个.json文件。此文件就是你所创建的数据库所对应的文件。
objectBox 生成的objectbox-models/default.json,要一直随着代码更新,但不能删除重新更新,否则会导致UID不一致而崩溃
在appLication中使用
boxStore = MyObjectBox.builder().androidContext(this).build();
Box<JzmObjectBoxBean> objectBoxBean = JzmApplication.getBoxStore().boxFor(JzmObjectBoxBean.class);
在model的build.gradle中添加依赖
debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
注意:当我再加上上面依赖后,总是build失败,com.android.dex.DexException这个错误,当把 apply plugin: 'io.objectbox'放到下面的时候就解决了。
开始调试界面的话。需要开通的权限
<uses-permission android:name="android.permission.INTERNET" />
//在针对API 28或更高版本时运行保持活动服务所必需的
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
application onCreate() 中加上允许调试的代码
if (BuildConfig.DEBUG) {
boolean started = new AndroidObjectBrowser(boxStore).start(this);
Log.i("ObjectBrowser", "Started: " + started);
}
OK 当你运行你的app时候会出现通知栏目,打开便是数据库的查看页。
想要在在电脑端查看数据库的话执行。
adb forward tcp:8090 tcp:8090
便可查看
使用模拟器不好使,真机可行
/**
* 增
* 当插入的数据中id为0 那么表示插入的是一个新的数据。数据库会分配一个新的id
*/
@Override
public void insert(LoginBean loginBean) {
Box<LoginBean> loginBox = MyApplication.getBoxStore().boxFor(LoginBean.class);
loginBox.put(loginBean);
}
/**、
* 删除具体的某个
* @param loginBean
*/
@Override
public void delete(LoginBean loginBean) {
loginBox.remove(loginBean);
}
/**
* 删除所有的数据
*/
@Override
public void deleteAll() {
loginBox.removeAll();
}
改和增都是用的 put 。检测到如果put的对象之前有那么就会进行修改
/**
* 根据id查出数据
*
* @param id
* @return
*/
@Override
public LoginBean getById(Long id) {
LoginBean loginBean = loginBox.query().equal(LoginBean_.id, id).build().findFirst();
return loginBean;
}
注意:@ID标志的是你的id,此id不能任意指定,当分配id的时候回自动增长。如果想任意分配id的话,要修改注解。像:@Id(assignable = true)。这样注解的表示可以任意指定你的id了。
值0(零)和-1(0xFFFFFFFFFFFFFFFF)不能用作ID。
ID为0的对象(如果ID是Long类型,则为 null)被认为是新的。插入这样的对象,数据库会认为是新数据并分配一个新的id。
如果您尝试使用ID大于当前最高ID的对象,则ObjectBox将引发错误。
如果要自己分配ID,您可以将ID注解更改为@Id(assignable = true) 。这将允许ID可以有任何值,包括0和-1。
当需要对一个参数频繁操作。可以引入@Index。提高性能 比如当有个参数是和id具有相同的性质。要根据此id进行查询等操作。那么就得加上此属性。
允许您在数据库级别上为属性自定义一个名称。这允许您重命名Java字段而不影响数据库级别上的属性名称(方便修改类)。
在数据库中的名字为 isLoginInDB 而非 isLogin
@NameInDb("isLoginInDB")
private boolean isLogin;
在数据库中不显示该字段。该属性不会被持久化
在数据库中该字段并没有生成
@Transient
private String isHaveInDB;
List<LoginBean> loginBeanList = loginBox.query().equal(LoginBean_.loginName, "基本密码").build().find();
List<LoginBean> loginBeanList = loginBox.query().eqeal(LoginBean_.firstName,"Joe").greater(LoginBean_yearOfBirth,1970).startWith(LoginBean_lastName,"0").find();
要返回匹配查询的所有实体
要仅返回第一个结果
如果你希望得到一个唯一的结果调用 findUnique()来代替。如果查询结果唯一,则返回该对象,如果查询结果不唯一,会抛出异常,如果没有查询结果则返回null。
Query<LoginBean> query = loginBox.query().equal(LoginBean_.loginName, "").build();
List<LoginBean> joeList = query.setParameter(LoginBean_.loginName, "Joe").find();
List<LoginBean> JbmmList = query.setParameter(LoginBean_.loginName,"基本密码").find();
这里我们使用了同一个查询对象来查找两组用户,每个用户的名字都不同。请注意, 构建查询时,我们仍然需要初始化firstName属性的值 。因为我们使用setParameter ()覆盖值。我们可以在初始构建查询时传递一个空字符串。
重用query的好处是不用每次通过build来获取,频繁查询会提高性能。
当数据库中有大量数据时,这是非常有用的。你不能仅仅使用查询条件来限制结果,还可以使用Limit,
用offset和limit参数查找(long offset ,long limit )方法。
offset :第一个 偏移量结果被跳过。
limit :返回此查询的数量。
查找所有的数据 查出来的结果跳过前面的5个,向后找10个
List<LoginBean> loginBeanListS = loginBox.query().build().find(5,10);
//查找fristName是 Joe 并且 lastName 以降序排序并不区分大小写的数据
loginBox.query().equal(LoginBean_.firstName, "Joe")
.order(LoginBean__.lastName, QueryBuilder.DESCENDING | QueryBuilder.CASE_SENSITIVE)
.find();
//查找id是 1 、 26 、27 的数据
List<LoginBean> loginBeanList1 = loginBox.query().in(LoginBean_.id,newlong[]{1, 26,27}).build().find();
//查找 id 从30到35之间的数据
List<LoginBean> loginBeanList1 = loginBox.query().between(LoginBean_.id,30,35).build().find();
//当loginName不为空并且id是10,和20的数据
List<LoginBean> loginBeanList1 = loginBox.query().notNull(LoginBean_.loginName).in(LoginBean_.id, new long[]{10, 20}).build().find();
//当loginName为空并且id是10,和20的数据
List<LoginBean> loginBeanList1 =loginBox.query().isNull(LoginBean_.loginName).in(LoginBean_.id, newlong[]{10, 20}).build().find();
//将属性值 loginName 设置为 name 在进行查询
QueryBuilder<LoginBean> query = loginBox.query()
.equal(LoginBean_.loginName, "").parameterAlias("name");
List<LoginBean> loginBeanLisquery.build().setParameter("name","基本密码A0").find();
//得到 所有的loginName集合
String [] stringName = loginBox.query().in(LoginBean_.id,new long[]{31,32}).build().property(LoginBean_.loginName).findStrings();
默认情况下,不返回空值。
但是,如果属性为null,则可以指定要返回的替换值
// 返回 'unknown' if email is null
String[] emails = userBox.query().build()
.property(User_.email)
.nullValue("unknown")
.findStrings();
//返回 属性中LoginName的所有值,并且 LoginName不能有重复的值
String[] stringName = loginBox.query().in(LoginBean_.id, new long[]{31, 32}).build().property(LoginBean_.loginName).distinct().findStrings();
**.distinct(StringOrder.CASE_SENSITIVE) 表示区分大小写 **
//在类上添加@Uid,然后build。然后再Gradle Console中会产生错误,并提示出一个@Uid字段。将这个字段复制到需要修改类下面
@Entity
@Uid(刚才生成的UID)
public class LoginBeanAgin {
@Id
private long id;
private String loginName;
private String loginPsw;
...
}
将生成的uid赋值后并修改类的名字重新build,便修改成功。成功后,刚才的uid即可删除
后续待补...
数据库简介 objectbox数据库是greenrobot团队开发的全新非关系型数据库框架,该团队还开发过greenDao,EventBus等热门框架,可谓实力雄厚。按照官方介绍,该库有如下特点: * 超快速:号称胜过测试过的所有嵌入式数据库 * 面向对象的 API: 没有 rows、columns 和 SQL,完全从0开始的对象(没有ORM,没有SQLite) * 反应性:对数据变化的反应简单而...
最近新项目要求做一个下载的功能,需要实现显示“已下载”和“正在下载”两个列表的展示,左思右想后,决定用数据库来实现记录下载任务信息的功能,也正好实战一下想了很久的ObjectBox数据库。 这个数据库是比较出名的另一个 Android 数据库greenDAO的母公司开发的,一个NoSQL数据库,也就是一个非 SQLite 的数据库,据说速度完爆任何移...
ObjectBox[一] 特性 ObjectBox[二] 教程:如何开始使用ObjectBox ObjectBox[三] 教程:安装和基础 ObjectBox[四] 数据库持久化之实体注解 ObjectBox[五] 基本操作:查询 ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions) ObjectBox[七] 支持LiveData...
前言 集成GreenDao查询官网可以看到一则通告:对于新应用程序,我们建议使用ObjectBox,这是一个新的面向对象的数据库,它比SQLite快得多并且易于使用。对于基于greenDAO的现有应用程序,我们提供了DaoCompat,可轻松切换(另请参见公告)。 于是,本篇便对比GreenDao写一个ObjectBox的简单使用说明,对比GreenDao集成起来更加容易,使用也比较简单。 介绍 ...
ObjectBox[一] 特性 ObjectBox[二] 教程:如何开始使用ObjectBox ObjectBox[三] 教程:安装和基础 ObjectBox[四] 数据库持久化之实体注解 ObjectBox[五] 基本操作:查询 ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions) ObjectBox[七] 支持LiveData...
在grovven脚本中 objectbox-android-objectbrowser使用 但是在kotlinDSL中这么写会报错,因为:plugins{}在build.gradle.kts前面有一个,会提示不能有两个plugins 正确的写法 去掉下面的就可以了 再不行再加上 参考: stackoverflow...
ObjectBox移动数据库框架 ObjectBox Github链接: 点击此处链接到Github 介绍 ObjectBox是移动端数据库框架,灵感来自于NoSql,速度非常快,号称是市面上最快的移动端数据库框架。 为什么要使用 快 简单,面向对象的API 添加依赖 项目级别的Gradle中添加: module级别的Gradle的头部添加: 之后Make Project一下项目 新建一个数据库对...
如果您熟悉greenDAO或EventBus之类的库,则可能听说过创建它们的公司: greenrobot 。 如果没有,我建议将它们检出。 简而言之,他们为应用程序开发人员构建了高质量的开源库。 最近,他们推出了一个名为ObjectBox的新库。 它用于帮助管理应用程序的本地数据存储。 他们的旧库greenDAO达到了相同的目的,但是ObjectBox是他们在本地存储解决方案中的下一步。 最大的区...
鸿蒙开发实战系列之一:鸿蒙开发实战系列之一:圆角 鸿蒙开发实战系列之二:鸿蒙开发实战系列之二:事件总线EventBus/RxBus 鸿蒙开发实战系列之三:鸿蒙开发实战系列之三:网络请求(原生+ Retrofit) 前言 随着项目逐渐从demo玩具进入到企业级应用,简单数据存储已经不能满足产品的欲望了,所以我们急需找到一款适合于鸿蒙系统的数据库,数据库必须符合轻量、高效、简便、跨平台、开源的特点,遍...
objectbox基础 参考链接 官网地址 http://objectbox.io github地址 https://github.com/objectbox/objectbox-java https://www.jianshu.com/p/24b7ffbbe383 demo下载 https://files.cnblogs.com/files/bruce2020/objectbox-example...