ObjectBox[二] 教程:如何开始使用ObjectBox
ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions)
ObjectBox[七] 支持LiveData(Android体系结构组件)
ObjectBox[十二] Meta Model, IDs, and UIDs
ObjectBox是一个直接保存对象的数据库。为了清晰,我们有时会调用那些可持久化的对象实体。要让ObjectBox知道哪些类是实体,请向其添加注解。然后ObjectBox就可以自动生成持久化需要的代码。
下面是一个例子:
@Entity
public class User {
@Id
private long id;
private String name;
@Transient
private int tempUsageCount; // not persisted
// getters and setters for id and user ...
}
@Entity注解表明User类是一个可以持久化的实体。将触发ObjectBox为此类生成定制的持久化代码。
注意:dumbs class (POJOs :Plain Old Java Objects, 简单洁净Java对象 )(java Bean类)作为实体是一个比较好的做法
注意: 如果您使用Kotlin来定义您的实体类,请查看ObjectBox和Kotlin文档。
对象ID:@Id
在ObjectBox中,每个对象都有一个long
类型的ID 来有效地获取或操作对象。在您的实体的长整型属性上使用 @Id注解 :
@Entity
public class User {
@Id
private long id;
...
}
对象ID有几点需要注意:
值0(零)和-1(0xFFFFFFFFFFFFFFFF)不能用作ID。
ID为0的对象(如果ID是Long类型,则为 null)被认为是新的。插入这样的对象,数据库会认为是新数据并分配一个新的id。
默认情况下,对象ID由ObjectBox分配。对于每个新的对象,ObjectBox将分配一个未使用的ID,该ID高于当前在Box中使用的最高ID值。例如,如果在一个Box中有两个对象ID 1和ID 100,则存入的下一个对象将被分配ID 101。
如果您尝试使用ID大于当前最高ID的对象,则ObjectBox将引发错误。
如果要自己分配ID,您可以将ID注解更改为
@Id(assignable = true)
。这将允许ID可以有任何值,包括0和-1。
如果您的应用程序中id是其他类型(例如由服务器提供的字符串UID),则可以将它们设置为标准属性(例如String uid),并使用query查询uid来得到实体。
@Entity
public class User {
@Id
private long id;
@Index
private String serverUid;
...
}
@Index 表示数据库会建立该属性的索引,当频繁查询该属性时会提高性能。
ObjectBox操作实体数据
ObjectBox需要访问你实体属性的数据(例如在生成的Cursor类中)。你有两个选择:
- 设置属性作用域为 “package private” (不是 “private”) 。在Kotlin中, 你可以使用
@JvmField
。 - 提供标准的 getters。
基本注解
@Entity
public class User {
@NameInDb("USERNAME")
private String name;
@Transient
private int tempUsageCount;
...
}
@NameInDb
允许您在数据库级别上为属性自定义一个名称。这允许您重命名Java字段而不影响数据库级别上的属性名称(方便修改类)。 注1:对于重命名,UID是首选。 注2:您目前只能使用内联常量来指定列名。
@Transient
表示该属性不会被持久化。
属性索引
使用@Index
表示数据库会建立该属性的索引,当频繁查询该属性时会提高性能。
@Entity
public class User {
@Id
private Long id;
@Index
private String name;
}
关系
可以在对象之间创建一对多和多对多关系,详情请参阅 关系文档。
代码生成
一旦写好你的实体代码,你可以通过编译你的项目来触发代码生成过程。例如 在Android Studio中使用Build> Make project。
如果在更改实体类后遇到错误,请尝试Rebuild项目,以确保清除原有生成的文件。