我有实体:
@Entity(tableName = "products")
public class Product{
@PrimaryKey(autoGenerate = true)
private Long id;
@ColumnInfo(name = "amount")
private BigDecimal amount;
我需要将其存储在房间数据库中。我不能存储BigDecimal
,我创建转换器:
public static class Converters {
@TypeConverter
public BigDecimal fromString(String value) {
return value == null ? null : new BigDecimal(value);
}
@TypeConverter
public Double amountToString(BigDecimal bigDecimal) {
if (bigDecimal == null) {
return null;
} else {
return bigDecimal.doubleValue();
}
}
}
并添加到列:
@TypeConverters(Converters.class)
@ColumnInfo(name = "amount")
private BigDecimal amount;
现在我把货币存储在双列中。我需要summtotalcurrency的方法:
@Query("SELECT SUM(amount) FROM products")
LiveData<Double> totalSum();
但我认为这是不好的方式,因为我可以失去一些价值观时,转换。
我的问题:如何在ROOM DB中创建货币?以及返回方法
LiveData<BigDecimal> totalSum();
3条答案
按热度按时间2vuwiymt1#
我使用的不是
Long
与BigDecimal
转换器,而是介于String
和BigDecimal
之间的转换器。警告:使用这种方式,您不能使用
SUM
,TOTAL
或其他表达式与房间数据库。因为我的应用程序的目的是使用多种货币,所以我手动检索数据并根据当前汇率计算。如果只有一种货币,可以使用
Double
代替String
:因此,您可以从Dao检索
SUM
、TOTAL
......:在数据库上使用
TypeConverter
:3phpmpom2#
你可以用long存储你的值。如果你在序列化的时候得到了1.55,把它乘以100,然后把long存储在db中。当你反序列化的时候,用这个long创建BigDecimal,然后除以100
kx1ctssn3#
@ip696您可以尝试将BigDecimal转换为Double,而不是将BigDecimal转换为String
那么下面的代码将工作。
补充说明:ORDER BY子句也将按预期工作。