2014-10-07 18 views
5

Tôi bắt đầu chơi với Realm.io trong một ứng dụng Android mà tôi đang viết. Trong một trong các đối tượng dữ liệu của tôi, tôi bắt buộc phải lưu trữ một giá trị tiền tệ. Trước đây tôi đã lưu trữ giá trị nội bộ dưới dạng giá trị BigDecimal và sau đó chuyển đổi giá trị đó thành và từ một giá trị kép khi di chuyển vào và ra khỏi cơ sở dữ liệu.Sử dụng Realm.io để lưu trữ các giá trị tiền

Tôi luôn được cho biết rằng nên lưu trữ giá trị tiền tệ gấp đôi vì cách xử lý chúng. Thật không may Realm.io không hỗ trợ lưu trữ và truy xuất các đối tượng BigDecimal.

Giải pháp tốt nhất để viết lớp tiền tệ của riêng tôi mở rộng RealmObject và giữ nó như một biến thành viên của đối tượng dữ liệu?

+0

Các nhà phát triển xamarin cũng cần số thập phân! – user2912553

Trả lời

5

Emanuele từ Realm ở đây.

Bạn nói đúng, sử dụng phao hoặc tăng gấp đôi tiền tệ là ý tưởng xấu.

Chúng tôi không hỗ trợ BigDecimal ngay bây giờ và trước khi chúng tôi thực hiện, chúng tôi sẽ phải xem cách phát liên quan đến tất cả các liên kết ngôn ngữ khác vì chúng tôi muốn tệp realm tương thích trên tất cả các nền tảng được hỗ trợ.

Ý tưởng của Kitô giáo là tốt, nhưng tôi thấy việc chuyển đổi đến và từ chuỗi trở nên chậm một chút. Nếu bạn không cần thuộc tính chính xác tùy ý của BigDecimal bạn có thể sử dụng long và nhân/chia cho hệ số mà bạn yêu cầu chính xác. Điều này cũng sẽ tiết kiệm rất nhiều không gian về kích thước của tập tin Realm vì các giá trị số nguyên được đóng gói bit.

4

Điều đó có thể hoạt động, nhưng có lẽ sẽ tối ưu hóa nếu thực hiện các phép tính trên các đối tượng BigDecimal hiện tại của bạn.

Bạn cũng có thể sử dụng các chú thích @Ignore để cung cấp một phương pháp wrapper cho các đối tượng tùy chỉnh của bạn như thế này:

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

Nó không phải là hoàn hảo như bạn cần phải vạch trần * dbValue) phương pháp (, nhưng nó nên công việc.

Tôi cũng khuyên bạn nên https://github.com/realm/realm-java/issues và thực hiện yêu cầu tính năng cho điều này vì BigDecimal có lẽ là một trong những lớp java được nhiều người sử dụng để bảo đảm hỗ trợ Realm nguyên bản, giống như Date.

0

Những gì tôi làm là lưu trữ nó như dài

tôi đã xác định trong ứng dụng của tôi một hằng số như sau:

public static final BigDecimal MONEY_PRECISION = new BigDecimal(1000); 

và khi tôi cần phải lưu trữ một số thập phân lớn nó đi như thế này:

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

} 

Về lý thuyết, điều này sẽ nhanh hơn lưu nó trên chuỗi, nhưng tôi chưa thực sự xem mã nguồn của nhiều lĩnh vực

Các vấn đề liên quan