类型迁移后,ObjectBox 不保留以前的值

问题描述

我们不得不将实体中的一个字段参数从 long 迁移到 BigDecimal。迁移很顺利,但有一个问题;我们希望保留以前的值设置为迁移的字段。但是一旦 ObjectBox 被初始化,它会将迁移字段认为当前类型的认值,在我们的例子中为 null

假设我们有:

Id(长) 姓名
123 随机名称

迁移后我们得到:

Id(字符串) 姓名
随机名称

是否有任何可能的迁移方式不会丢失迁移字段的值?

附注:我使用转换器来保留 BigDecimal 值,因为 ObjectBox 不支持 BigDecimal

转换器类:

public class BigIntegerStringConverter implements PropertyConverter<BigInteger,String> {
    @Override
    public BigInteger convertToEntityProperty(String databaseValue) {
        return databaseValue == null ? null : new BigInteger(databaseValue);
    }

    @Override
    public String convertToDatabaseValue(BigInteger entityProperty) {
        return String.valueOf(entityProperty);
    }
}

用法

@Convert(converter = BigIntegerStringConverter.class,dbType = String.class)
@Uid(XXXXXXXX)
BigInteger tigerId;

解决方法

@Farid 手动迁移可能看起来像这样:

  1. 向模型添加一个新字段,使用您要使用的新类型,例如newField
  2. 添加更新所有对象的代码,读取 oldField 并将适当的值写入 newField
  3. 从模型中删除 oldField,现在所有数据都已迁移
  4. 可选地,您可以follow the docs on how to rename newField 到您想要的任何内容
,

遗憾的是,ObjectBox 不支持保留旧数据的类型迁移

参考:https://github.com/objectbox/objectbox-java/issues/971

,

ObjectBox 不支持将现有属性数据迁移到新类型。你必须自己处理这个,例如通过保留旧属性并添加一些迁移逻辑。

来源:https://docs.objectbox.io/advanced/data-model-updates#changing-property-types