Android数据库ObjectBox使用说明
前言
集成GreenDao查询官网可以看到一则通告:对于新应用程序,我们建议使用ObjectBox,这是一个新的面向对象的数据库,它比SQLite快得多并且易于使用。对于基于greenDAO的现有应用程序,我们提供了DaoCompat,可轻松切换(另请参见公告)。
于是,本篇便对比GreenDao写一个ObjectBox的简单使用说明,对比GreenDao集成起来更加容易,使用也比较简单。
介绍
ObjectBox数据库是用于对象的超快速轻量级数据库,由greenrobot团队开发,与GreenDao,EventBus等师出同门。
从 greenDAO 迁移到 ObjectBox 提供了各种优势:
- 更快: ObjectBox 比 SQLite 快10倍(检查这个开源基准应用程序)
- 强大的关系支持: ObjectBox 提供了更改跟踪、级联放置和灵活的加载策略(渴望和懒惰)
- 不需要掌握 SQL: ObjectBox 更容易使用,不需要学习“外语”
- 现代 api: ObjectBox 具有简化的 api,并提供了自己的反应式查询和对 rxjava2/3的支持(具有真正的变更观察)
- 更清晰的实体代码: ObjectBox 具有不可见的代码生成,并且不会在文件中生成源代码
- 支持 Kotlin: ObjectBox 支持 Kotlin,包括数据类
- 同步即将到来: 基于典型的 REST 网络方法,保持数据同步是很难做到的。使之变得简单
Github地址:https://github.com/objectbox/objectbox-java
项目配置
1、项目根 build.gradle (项目级别) 配置:
buildscript {
ext.objectboxVersion = '2.8.1'
dependencies {
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}
2、应用程序 build.gradle (模块级) 配置:
apply plugin: 'io.objectbox' // 应用Android插件后
使用说明
1、新建实体类,如下:
@Entity
public class User {
@Id
public Long id;
public String userId;
public String userName;
public int age;
}
- @Entity:对象持久化;
- @Id:这个对象的主键,默认情况下,id是会被objectbox管理的,也就是自增id。手动管理id需要在注解的时候加上@Id(assignable = true)。当你在自己管理id的时候如果超过long的最大值,objectbox 会报错;id的值不能为负数;当id等于0时objectbox会认为这是一个新的实体对象,因此会新增到数据库表中;
- @Index:这个对象中的索引。经常大量进行查询的字段创建索引,用于提高查询性能;
- @Transient:某个字段不想被持久化,可以使用此注解,字段将不会保存到数据库;
- @NameInDb:数据库中的字段自定义命名;
- @ToOne:做一对一的关联注解 ,此外还有一对多,多对多的关联,例如Class的示例;
- @ToMany:做一对多的关联注解;
- @Backlink:表示反向关联。
它必须具有非私有的可见性(或非私有的 getter 和 setter 方法)。
2、点击AndroidStudio中的Make Project
(小锤子的图标),objectbox为项目生成类 MyObjectBox
类,用于初始化生成 BoxStore
对象,进行数据库管理。然后,通过BoxStore对象为实体类获得一个 Box 类,Box 对象提供对所有主要函数的访问,比如 put、 get、 remove 和 query。
核心API:
- MyObjectBox: 基于您的实体类生成,MyObjectBox 提供一个构建器为您的应用程序设置一个 BoxStore。
- BoxStore: 使用 ObjectBox.BoxStore 的入口点是到数据库的直接接口,并管理 Boxes。
- Box: 保存一个盒子并查询实体。对于每个实体,有一个 Box (由 BoxStore 提供)。
3、数据库操作:
(1)新建ObjectBox操作类,用于初始化及数据库管理:
public class ObjectBox {
private static BoxStore mBoxStore;
public static void init(Context context) {
mBoxStore = MyObjectBox.builder()
.androidContext(context.getApplicationContext())
.build();
}
public static BoxStore get() { return mBoxStore; }
}
(2)调用ObjectBox类进行初始化,并为User实体类获得一个 Box 类,进行具体操作:
private void initUserBox() {
ObjectBox.init(this);
mBoxStore = ObjectBox.get();
mUserBox = mBoxStore.boxFor(User.class);
}
(3)数据库增删改查:
-
初始化数据,批量添加,调用实体的
Box
对象,调用put()
方法即可完成新增操作:private void initUser() { //用户ID生成器 mIdWorker = new SnowflakeIdGenerator(0, 0); mUserBox.removeAll(); mUserList = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) { User user = new User(); user.setUserId(String.valueOf(mIdWorker.nextId())); // 随机生成汉语名称 user.setUserName(NameUtils.createRandomZHName(random.nextInt(4) + 1)); user.setAge(18 + random.nextInt(10)); mUserList.add(user); } mUserAdapter = new UserAdapter(mUserList); rvUser.setAdapter(mUserAdapter); mUserBox.put(mUserList); }
-
查询数据,通过
Box
的query()
方法可以得到一个QueryBuilder
对象,该对象可以实现各种查询操作,里面包含contains()
,equal()
等方法:private void queryAllUser() { mUserList = mUserBox.query().build().find(); mUserAdapter.setNewData(mUserList); rvUser.smoothScrollToPosition(mUserList.size() - 1); }
-
添加数据,调用实体的
Box
对象,调用put()
方法即可完成新增操作:User user = new User(); user.setUserId(String.valueOf(mIdWorker.nextId())); user.setUserName(NameUtils.createRandomZHName(new Random().nextInt(4) + 1)); user.setAge(18 + new Random().nextInt(10)); // 插入新用户 mUserBox.put(user);
-
修改数据,得到要修改的实体类,修改数据,随后调用实体的
Box
对象put()
方法:User user = mUserList.get(mUserList.size() - 1); user.setUserName(NameUtils.createRandomZHName(new Random().nextInt(4) + 1)); //更新最末用户 mUserBox.put(user);
-
删除数据,调用实体的
Box
对象remove()
方法:User user = mUserList.get(mUserList.size() - 1); //删除最末用户 mUserBox.remove(user);
以上就是ObjectBox数据库操作的基本使用说明了,在之前写的GreenDao上面修改了使用方法,对比GreenDao还是十分简单的,更多用法可以查看API文档解锁使用:https://docs.objectbox.io/。
访问Github
项目查看具体代码实现:
https://github.com/MickJson/DevelopmentRecord
欢迎点击查阅及Star,我也会继续补充其它有用的知识及例子在项目上。
欢迎点赞/评论,你们的赞同和鼓励是我写作的最大动力!