2018.03.30、Android-ObjectBox学习笔记1

一、特点:

  • 更快:目前的所有移动端数据库都快。
  • 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();
复制代码

注意

  1. (MyObjectBox 类是自动生成,如果没有生成,请Rebuild)
  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值