ObjectBox[九] 数据模型变更

ObjectBox[一] 特性

ObjectBox[二] 教程:如何开始使用ObjectBox

ObjectBox[三] 教程:安装和基础

ObjectBox[四] 数据库持久化之实体注解

ObjectBox[五] 基本操作:查询

ObjectBox[六] 数据监听和RX(Data Observers and Reactive Extensions)

ObjectBox[七] 支持LiveData(Android体系结构组件)

ObjectBox[八] 关系

ObjectBox[九] 数据模型变更

ObjectBox[十] 自定义类型

ObjectBox[十一] 事务

ObjectBox[十二] Meta Model, IDs, and UIDs

ObjectBox[十三] 数据调试


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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值