一、特点:
- 更快:目前的所有移动端数据库都快。
- Object API:ObjectBox是一个从零开始的对象数据仓库(没有ORM,没有SQLite)。API简单易学
- 对象关系: 对象之间的引用和关系编译在本地代码中
- (Reactive)响应:使用自身的响应式方法或者内部集成的Rxjava处理数据简单又强大。
- 简单的线程:ObjectBox能在所有线程中工作,不需要其他参数。
- 无需手动控制版本升级:ObjectBox自动添加、删除、更新新的对象属性。
二、如何使用
1、ObjectBox GitHub地址:
https://github.com/objectbox/objectbox-java
2、如何配置
1.Gradle设置
在Root build文件中添加
// In your root build.gradle file:
buildscript {
ext.objectboxVersion = '1.2.1'
repositories {
jcenter()
maven { url "http://objectbox.net/beta-repo/" }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
}
}
allprojects {
repositories {
jcenter()
maven { url "http://objectbox.net/beta-repo/" }
}
}
// In your (app) module build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'io.objectbox'
复制代码
Gradle插件会自动添加依赖库,并配置一个注解处理器,在构建时生成代码和JSON数据对象。
然后编写实体(@Enter)并编译您的项目,例如在Android Studio中使用Build> Make Project。
如果库或注解处理器没有自动添加到依赖中,您可以手动添加它们。对于注解处理器,在Java中使用annotationProcessor关键字,如果项目使用Kotlin,则使用kapt关键字:
dependencies {
// all below should be added automatically by the plugin
compile "io.objectbox:objectbox-android:$objectboxVersion"
// some useful Kotlin extension functions
// compile "io.objectbox:objectbox-kotlin:$objectboxVersion"
annotationProcessor "io.objectbox:objectbox-processor:$objectboxVersion"
// When using Kotlin use kapt instead:
// kapt "io.objectbox:objectbox-processor:$objectboxVersion"
}
复制代码
2.可选配置 在您的app模块Gradle构建文件(您的实体所在的位置)中,您可以添加一些可选的配置。例如,你可以在调试模式切换为ObjectBox注解处理器(运行Gradle –info 可以看到Debug 输出信息):
// Using annotationProcessor (Java):
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ 'objectbox.debug' : 'true' ]
}
}
}
}
// Using kapt (Kotlin):
kapt {
arguments {
arg("objectbox.debug", true)
}
}
复制代码
3、简单使用
1.创建一个实体对象
@Entity
public class Note {
@Id
long id;
String text;
String comment;
Date date;
...
}
复制代码
@Entity:注解表明 Note 是一个写入数据库的实体
@Id :表明 long id 作为Key
接下来编译工程,ObjectBox会生成一些类,如 MyObjectBox 。还有一些ObjectBox在内部使用的其他一些类。
2.基本使用
- 创建获得操作实体 :首先,我们必须为我们的Note类准备一个Box对象,我们 在NoteActivity 的 onCreate()中做 :
//注意: 在Demo中,“App”是继承Application的类 ,推荐BoxStore在这里获取 。
notesBox = ((App) getApplication()).getBoxStore().boxFor(Note.class);
复制代码
- 插入:
//请注意,Note传递了0作为id。表示一个新的实体,ObjectBox会在内部分配一个新的id 。
Note note = new Note(0, noteText, comment, new Date());
notesBox.put(note);
Log.d(App.TAG, "Inserted new note, ID: " + note.getId());
复制代码
- 删除:
notesBox.remove(note);
复制代码
- 更新
// note 不是自己创建的 是从数据库中查出来的
note.setText("This note has changed.");
notesBox.put(note);
复制代码
- 初始化数据库
现在您已经看到了ObjectBox 正常运行,但是我们如何获取 BoxStore实例?通常,您应该为Application类中的整个应用程序设置一次BoxStore:
//在Application中 创建boxStore ,然后对外提供getterStore ()之类的getter,
//让activity和fragment或者其他你想调用的地方来使用。
boxStore = MyObjectBox.builder().androidContext(App.this).build();
复制代码
注意
- (MyObjectBox 类是自动生成,如果没有生成,请Rebuild)
- ObjectBox本身是一个NoSQL数据库,因此不基于SQL或SQLite。这就是为什么在初始化期间不需要设置“CREATE TABLE”语句的原因。
三、Box API介绍
1、核心类
一旦定义了至少一个实体并成功构建了项目,就可以在Android项目中开始使用ObjectBox。 以下核心类是ObjectBox的基本接口:
- MyObjectBox:根据实体类自动生成,MyObjectBox提供一个builder 来获取BoxStore。
- BoxStore:使用ObjectBox的入口。BoxStore是您的数据库的直接接口和管理Box。
- Box:一个Box持续存在并用于查询实体。对于每个实体,都有一个Box(由BoxStore提供)。
- 实体:使用ObjectBox注释将对象类标记为可持久。
2、初始化
最后,初始化ObjectBox类的基本步骤:
// do this once, for example in your Application class
boxStore = MyObjectBox.builder().androidContext(App.this).build();
// do this in your activities/fragments to get hold of a Box
notesBox = ((App) getApplication()).getBoxStore().boxFor(Note.class);
复制代码
该示例假定存在一个 Note 实体类。通过Box( NotesBox 类型会根据Note自动生成),我们可以调用notesBox 对Note数据进行操作。
3.Box基本操作
该Box类 是一个基本类。如前所述,您可以通过BoxStore.boxFor()获取Box单例 。Box单例使您可以访问特定类型的对象。例如,如果您有 Customer 和 Order 实体,则需要两个Box对象与其进行交互:
Box<Customer> customerBox = boxStore.boxFor(Customer.class);
Box<Order> orderBox = boxStore.boxFor(Order.class);
复制代码
这些是Box类提供的一些操作:
-
put: 写入一个对象,它会覆盖数据库中具有相同Id的对象。换句话说,使用 put 来插入或更新对象。put返回值为该对象在数据库中的Id。各种 put 重载方法支持放置多个对象,方便快捷。
-
get:参数为Id,就可以获取数据库中该Id的对象。要获取某个类型的所有对象,请使用 getAll 。
-
remove: 删除该对象。有多个重载方法删除多个实体, removeAll 删除一个类型的所有对象。
-
count:返回Box存储的对象的数量。
-
query:返回query builder。
-
对象Object IDs:
对象必须有一个long类型的ID(注解为@Id)。当然也可以使用包装类java.lang.Long,但是我们不建议这么做,因为long在ObjectBox 中非常的高效。
如果您的应用程序中id是其他类型(例如由服务器提供的字符串UID),则可以将它们设置为标准属性 (例如String uid 正常的数据表字段),并使用query查询uid来得到实体。
- 特殊对象ID:
对象ID可以是任何 长整型 值,但有两个例外:
- ID为0的对象(如果ID是Long类型,则为 空)被认为是新的。插入ID为0的对象,数据库会分配一个新的ID。
- 0xFFFFFFFFFFFFFFFF(在Java中为-1): 此值由ObjectBox保留供内部使用,可能不会被应用程序使用.
- 对象ID分配
默认情况下,对象ID由ObjectBox分配。对于每个新的对象,ObjectBox将分配一个未使用的ID,该ID高于当前在盒子中使用的最高ID值。例如,如果在一个Box中有两个对象ID 1和ID 100,则放置的下一个对象将被分配ID 101。
默认情况下,只有ObjectBox可以分配ID。如果您尝试使用的ID大于当前最高ID或更改ID,则ObjectBox会报错。 如果您需要自己分配ID,则可以将ID注释更改为 @Id(assignable = true) 。这将允许将一个对象Id有任何值,包括0。
- 事务
ObjectBox提供强大的事务处理功能,但对于许多应用程序来说,仅仅使用事务的一些基本用法就足够了。
- 1.一个 put 运行一个隐含的事务。
- 2.多个对象 首选list重载方法put( entities)
- 3.对于循环中的大量数据库交互,请考虑显式事务,例如使用 runInTx()
学习参考: https://blog.csdn.net/vxiaocai/article/details/78646399