簡體   English   中英

使用Realm.io存儲貨幣價值

[英]Using Realm.io to store money values

我正在開始在我正在編寫的Android應用程序中使用Realm.io。 在我的一個數據對象中,我需要存儲貨幣值。 以前我在內部將值存儲為BigDecimal值,然后在移入和移出數據庫時也將其轉換為double值。

我一直被告知,由於處理它們的方式,將貨幣值存儲在double中是個壞主意。 不幸的是,Realm.io不支持存儲和檢索BigDecimal對象。

編寫我自己的擴展RealmObject的貨幣類並將其作為數據對象的成員變量保留的最佳解決方案是什么?

來自Realm的Emanuele在這里。

你是對的,使用花車或雙人幣作為貨幣是一個主意。

我們現在不支持BigDecimal,在我們開始之前,我們必須看看它與所有其他語言綁定的關系,因為我們希望realm文件在所有支持的平台上兼容。

克里斯蒂安的想法很好,但我看到轉換為String的轉換有點慢。 如果您不需要BigDecimal的任意精度屬性,則可以使用long並乘以/除以所需精度所需的因子。 由於整數值是有點打包的,因此這也會在Realm文件的大小方面節省大量空間。

這可能會起作用,但如果對當前的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支持,只是就像Date一樣。

我所做的就是存儲它

我在我的應用程序中定義了一個常量,如下所示:

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);
    }

}

從理論上講,這應該比將其保存在字符串上更快,但我還沒有真正看過領域代碼

我的解決方案

定義界面:

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

當你需要使用實體時:調用方法轉換obj

這不是一個優雅的解決方案,但它的工作原理。

Christian Melchior的答案在我的應用程序中不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM