2014-10-07 3 views
5

Я начинаю играть с Realm.io в приложении для Android, которое я пишу. В одном из моих объектов данных я должен хранить значение валюты. Раньше я хранил значение внутри себя как значение BigDecimal, а затем преобразовывал его в двойное значение и из него при перемещении в базу данных и из нее.Использование Realm.io для хранения денежных средств

Мне всегда говорили, что неплохо хранить валютные ценности в двойном из-за того, как они обрабатываются. К сожалению, Realm.io не поддерживает хранение и извлечение объектов BigDecimal.

Является лучшим решением для написания собственного класса валют, который расширяет RealmObject и сохраняет его как переменную-член объекта данных?

+0

Также разработчикам xamarin нужно десятичное число! – user2912553

ответ

5

Эмануэле из Королевства здесь.

Вы правы, используя поплавки или парные разряды для валюты bad идея.

Мы не поддерживаем BigDecimal на данный момент, и прежде чем мы это сделаем, нам нужно будет увидеть, как это происходит в отношении всех других языковых привязок, поскольку мы хотим, чтобы файлы в реальном времени были совместимы на всех поддерживаемых платформах.

Идея Кристиана хорошая, но я вижу, что преобразование в и из Строка должно быть немного медленным. Если вам не нужно свойство произвольной точности 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, которые используются многими, что может гарантировать поддержку Real 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); 
    } 

} 

В теории это должно быть быстрее, чем сохранить его на струнах, но я действительно не смотрел на код царств много

Смежные вопросы