Uso de Realm.io para almacenar valores monetarios

Estoy empezando a jugar con Realm.io en una aplicación para Android que estoy escribiendo. En uno de mis objetos de datos estoy obligado a almacenar un valor de moneda. Anteriormente había almacenado el valor internamente como un valor BigDecimal y, a continuación, convertido que ay desde un valor doble al moverse dentro y fuera de la base de datos.

Siempre me han dicho que es una mala idea para almacenar los valores de moneda en un doble debido a la forma en que se manejan. Desafortunadamente Realm.io no admite almacenamiento y recuperación de objetos BigDecimal.

¿Es la mejor solución para escribir mi propia clase de moneda que extiende RealmObject y mantener eso como una variable de miembro por objeto de datos?

Emanuele de Realm aquí.

Usted tiene razón, el uso de flotadores o dobles para la moneda es una mala idea.

No apoyamos a BigDecimal por ahora, y antes de hacerlo tendremos que ver cómo funciona eso en relación con todos los enlaces de otros idiomas, ya que queremos que los archivos de dominio sean compatibles en todas las plataformas soportadas.

La idea de Christian es buena, pero veo que la conversión de y hacia String es un poco lenta. Si no necesita la propiedad de precisión arbitraria de BigDecimal, puede utilizar long y multiply / divide por el factor que requiere su precisión. Esto también ahorraría mucho espacio en términos del tamaño del archivo Realm, ya que los valores enteros están poco cargados.

Eso podría funcionar, pero probablemente sería subóptimo si hacer cálculos en sus objetos BigDecimal actuales.

También puede utilizar la anotación @Ignore para proporcionar un método de contenedor para sus objetos personalizados como este:

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

No es perfecto ya que es necesario exponer los métodos * dbValue (), pero debería funcionar.

También sugeriría ir a https://github.com/realm/realm-java/issues y hacer una petición de la característica para esto como BigDecimal es probablemente una de esas clases de java usadas por tan muchos que podría justificar la ayuda nativa del reino, apenas Como la fecha ha.

  • Realm Exception 'value' no es un objeto gestionado válido
  • Cómo truncar todas las tablas en el reino de Android
  • ¿Cuál es la mejor manera de usar List <String> en Realm Android?
  • Implementar un formulario de consulta de unión en un db de dominio sin tener una relación predefinida en struture
  • Cómo cerrar el reino abierto por Realm.getDefaultInstance?
  • Realm java sort con varios campos
  • Realm Android - ¿Cómo puedo convertir RealmResults a una matriz de objetos?
  • Realm Auto Incremento campo ejemplo
  • No puede compilar la aplicación de Android con el reino
  • Cómo ver mi archivo Realm en el Realm Browser?
  • RealmMigrationNeededException al cambiar el modelo de Realm
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.