7

I'm starting to play with Realm.io in an Android app that I'm writing. In one of my data objects, I'm required to store a currency value. Previously I had stored the value internally as a BigDecimal value and then converted that too and from a double value when moving in and out of the database.

I have always been told that it is a bad idea to store currency values in a double because of the way that they are handled. Unfortunately, Realm.io doesn't support the storage and retrieval of BigDecimal objects.

Is the best solution to write my own currency class that extends RealmObject and keeps that as a member variable of by data object?

4

4 回答 4

7

来自 Realm 的 Emanuele。

你是对的,使用浮点数或双精度数是一个主意。

我们目前不支持 BigDecimal,在我们这样做之前,我们必须看看它与所有其他语言绑定的关系如何,因为我们希望领域文件在所有支持的平台上兼容。

Christian 的想法很好,但我认为与 String 之间的转换有点慢。如果您不需要 BigDecimal 的任意精度属性,您可以使用long并乘以/除以所需精度要求的因子。由于整数值是位压缩的,因此这也将在 Realm 文件的大小方面节省大量空间。

于 2014-10-07T07:26:58.187 回答
5

这可能有效,但如果对您当前的 BigDecimal 对象进行计算,则可能不是最理想的。

您还可以使用 @Ignore 注释为您的自定义对象提供包装方法,如下所示:

public class Money extends RealmObject {

  private String dbValue;
  @Ignore private BigDecimal value;

  public String getDbValue() {
      return dbValue;
  }

  public void setDbValue(String dbValue) {
      this.dbValue = dbValue;
  }

  public BigDecimal getValue() {
     return new BigDecimal(getDbValue());
  }

  public void setValue(BigDecimal value) {
      setDbValue(value.toString());
  }
}

它并不完美,因为您需要公开 *dbValue() 方法,但它应该可以工作。

我还建议转到https://github.com/realm/realm-java/issues并为此提出功能请求,因为 BigDecimal 可能是许多人使用的那些 java 类之一,它可以保证原生 Realm 支持,只是就像日期一样。

于 2014-10-07T06:54:43.497 回答
0

我所做的就是将它存储多久

我在我的应用程序中定义了一个常量,如下所示:

public static final BigDecimal MONEY_PRECISION = new BigDecimal(1000);

当我需要存储一个大的小数时,它是这样的:

public class MoneyClass extends RealmObject {
    long _price = 0;

    public void set_price(BigDecimal price) {
        this._price = price.longValue() * App.MONEY_PRECISION.longValue();
    }

    public BigDecimal get_price() {
       return new BigDecimal(_price).divide(App.MONEY_PRECISION, 0, 0);
    }

}

从理论上讲,这应该比将其保存在字符串上要快,但是我并没有真正看过领域代码

于 2018-02-13T09:10:58.393 回答
0

我的解决方案:

定义接口:

public interface RealmConvert {
   void convertToDB();

   void convertToObj();
}

定义实体:

@Ignore
private BigDecimal balance;
private String balanceStr;
@Override public void convertToDB() {
  if (getBalance() != null) {
    setBalanceStr(getBalance().toString());
  }
}
@Override public void convertToObj() {
  if (getBalanceStr() != null) {
    setBalance(new BigDecimal(getBalanceStr()));
  }
}

在你 copyToRealm 之前:调用方法 convertToDB

需要使用实体时:调用方法convert obj

这不是一个优雅的解决方案,但它确实有效。

Christian Melchior 的回答在我的应用程序中不起作用。

于 2019-09-06T03:37:15.753 回答