2014-10-07 59 views
5

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

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

是編寫自己的貨幣類的最佳解決方案,該類可以擴展RealmObject並將其作爲數據對象的成員變量保留下來?

+0

也xamarin開發人員需要小數! – user2912553 2017-07-07 15:02:08

回答

5

Emanuele from Realm here。

你是對的,使用花車或雙打貨幣是一個不好的想法。

我們現在不支持BigDecimal,在這之前我們必須看看它如何與所有其他語言綁定相關,因爲我們希望領域文件在所有支持的平臺上都兼容。

Christian的想法很好,但是我看到String和String之間的轉換有點慢。如果您不需要BigDecimal的任意精度屬性,則可以使用long並乘以/除以所需精度要求的因子。根據Realm文件的大小,這也可以節省很多空間,因爲整數值是打包的。

4

這可能會奏效,但如果對當前的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一樣。

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

} 

從理論上講,這應該是比它保存在串快,但我還沒有真正望着領域代碼更