2014-10-07 69 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); 
    } 

} 

从理论上讲,这应该是比它保存在串快,但我还没有真正望着领域代码更