2014-10-07 2 views
5

내가 쓰고있는 Android 앱에서 Realm.io로 게임을 시작합니다. 내 데이터 객체 중 하나에서 통화 가치를 저장해야합니다. 이전에는 값을 내부적으로 BigDecimal 값으로 저장 한 다음 데이터베이스로 이동할 때 이중 값으로 변환하거나 변환했습니다.Realm.io를 사용하여 금액 저장

통화 값을 처리하는 방식 때문에 통화 값을 이중으로 저장하는 것은 좋지 않다고 항상 들었습니다. 불행히도 Realm.io는 BigDecimal 객체의 저장과 검색을 지원하지 않습니다.

RealmObject를 확장하고 데이터 객체의 멤버 변수로 유지하는 자체 통화 클래스를 작성하는 가장 좋은 해결책이 있습니까?

+0

또한 xamarin 개발자는 소수가 필요합니다! – user2912553

답변

5

여기에서 영역은 Emanuele입니다.

통화가 부동 또는 복식을 사용하는 것이 맞습니다. 입니다.

우리는 지금까지 BigDecimal을 지원하지 않으며, 지원하기 전에 지원되는 모든 플랫폼에서 영역 파일을 호환 할 수 있기 때문에 모든 다른 언어 바인딩과 관련하여 어떻게 재생되는지 살펴보아야합니다.

크리스챤의 아이디어는 좋지만, 나는 조금 더 느리게 문자열을 변환하는 것을 볼 수 있습니다. BigDecimal의 임의 정밀도 속성이 필요하지 않은 경우 long을 사용하고 필요한 정밀도를 요구하는 요소를 곱하거나 나누십시오. 또한 정수 값이 비트 압축되기 때문에 영역 파일의 크기면에서 많은 공간을 절약 할 수 있습니다.

4

현재의 BigDecimal 객체에서 계산할 수는 있지만 작동하지 않을 수 있습니다.

당신은 또한이 같은 사용자 정의 개체에 대한 래퍼 방법을 제공하기 위해 @Ignore 주석을 사용할 수 있습니다

당신이 * dbValue() 메소드를 노출해야하므로 그것은 완벽하지
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()); 
    } 
} 

하지만해야 작업.

또한 https://github.com/realm/realm-java/issues으로 이동하여 BigDecimal이 아마도 많은 사람들이 사용하는 Java 클래스 중 하나 인 것처럼 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); 
    } 

} 

이론적으로 이것은 문자열에 저장하는 것보다 빠릅니다. 그러나 실제로 영역 코드를 많이 보지 않았습니다.