ObjectBox[二] 教程:如何开始使用ObjectBox
ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions)
ObjectBox[七] 支持LiveData(Android体系结构组件)
ObjectBox[十二] Meta Model, IDs, and UIDs
ObjectBox管理数据模型(模式)主要是自动管理。数据模型由您定义的实体类定义。当您添加或删除实体的属性时,ObjectBox会自动处理这些更改。
对于其他更改(如重命名或更改类型),ObjectBox需要使用唯一的IDs(UIDs)和 @Uid
注解来确保更改准确。,具体看下面的例子。
注意:变更需要ObjectBox v1.0.1或更高版本。
UIDS
ObjectBox通过分配唯一ID(UIDs)来跟踪实体和属性。所有这些UIDs都存储在一个文件“objectbox-models / default.json”中,您应该添加到您的版本控制系统(例如git)中。如果你有兴趣,我们有一个关于UIDs深度文档。但让我们继续如何重命名实体或属性。
简而言之:要进行与UID相关的更改,请 在实体或属性上添加@ Uid注释,并编译项目以获取进一步的说明。
重命名实体和属性
那么为什么我们需要这个UID注解呢?如果您只是简单地重命名一个实体类,那么ObjectBox只会看到旧的实体已经消失,并且有一个新的实体可用。这可以用两种方式来解释:
旧的实体被删除,应该添加一个新的实体,丢弃旧的数据。这是ObjectBox 的默认行为。
该实体被重新命名,旧的数据应该被重新使用。
所以要告诉ObjectBox做一个重命名而不是丢弃旧的实体和数据,你需要确保它知道这是同一个实体,而不是一个新的实体。通过将内部UID附加到实体来实现这一点。
属性也是如此。
现在我们来看看如何做到这一点。如果你想重命名一个属性,这个过程的工作原理是一样的:
操作方法
第1步:为要重命名的实体/属性 添加一个空的 @Uid
注释:
@Entity
@Uid
public class MyName { ... }
第2步:编译项目会报错,并提供错误信息,提示实体/属性的当前UID:
error: [ObjectBox] UID operations for entity "MyName":
[Rename] apply the current UID using @Uid(6645479796472661392L) -
[Change/reset] apply a new UID using @Uid(4385203238808477712L)
第3步:将错误消息的[Rename]部分的UID应用于您的实体/属性:
@Entity
@Uid(6645479796472661392L)
public class MyName { ... }
第4步:最后要做的是在语言层面上的实际重命名(Java,Kotlin等):
@Entity
@Uid(6645479796472661392L)
public class MyNewName { ... }
您现在可以按预期方式使用您的重命名实体/属性,并且所有现有数据仍将保留在那里。
注意:除了上面的内容外,您还可以自己在ObjectBox的default.json文件中找到实体/属性的UID,并在重命名实体/属性之前将其与@Uid注释一起添加。
更改属性类型
当你想改变一个属性的类型时,你必须告诉ObjectBox在内部创建一个新的属性。这是因为ObjectBox不能迁移你的数据,所以简单的改变类型可能会导致数据丢失。你可以用两种方法来做到这一点:
只需重命名该属性,将其视为一个新的属性(只有当该属性没有@UID注释时才可以使用):
// old:
String year;
// new:
int yearInt;
告诉ObjectBox为该属性使用新的UID。让我们来看看如何做到这一点:
操作方法和示例
第1步: 将@ Uid 注释添加 到要更改类型的属性:
@Uid
String year;
第2步: 建立项目。构建将失败,并显示一个错误消息,给你一个新创建的UID值:
error: [ObjectBox] UID operations for property "MyEntity.year":
[Rename] apply the current UID using @Uid(6707341922395832766L) -
[Change/reset] apply a new UID using @Uid(9204131405652381067L)
第3步: 从[Change / reset]部分应用UID到您的属性:
@Uid(9204131405652381067L)
int year;
你现在可以在你的实体中使用这个属性,就像它是一个新的一样。
原文:http://objectbox.io/documentation/objectbox-entity-property-migration/