如何在实(SQlite)列中存储BigDecimal(Java)值?
我对BigDecimal仍然有很大的问题(眼泪的痕迹开始了,一直持续到现在) 现在我遇到了相反的问题——从POJO中的BigDecimal到SQLite表中的REAL POJO定义为:如何在实(SQlite)列中存储BigDecimal(Java)值?,java,android,sqlite,bigdecimal,Java,Android,Sqlite,Bigdecimal,我对BigDecimal仍然有很大的问题(眼泪的痕迹开始了,一直持续到现在) 现在我遇到了相反的问题——从POJO中的BigDecimal到SQLite表中的REAL POJO定义为: public class DeliveryItem { private int _id; private String _invoiceNumber; private String _UPC_PLU; private String _vendorItemId; privat
public class DeliveryItem {
private int _id;
private String _invoiceNumber;
private String _UPC_PLU;
private String _vendorItemId;
private int _packSize;
private String _description;
private BigDecimal _cost;
private BigDecimal _margin;
private BigDecimal _listPrice;
private int _departmentNumber;
private String _subdepartment;
private String _quantity;
public void setID(int id) {
this._id = id;
}
. . .
这段代码试图获取能够发布到SQLite表的数据(其中对应的列是数据类型REAL,SQLite唯一的REAL/float数据类型):
对于上面的列_COST line(“MARGIN”和“LISTPRICE”列有相同的问题),我在尝试以下操作时得到“error:不兼容的类型:bigdecim无法转换为Double”:
values.put(COLUMN_COST, (Double) delItem.get_cost());
…对于注释掉的代码(两行),即:
values.put(COLUMN_COST, delItem.get_cost());
…这是:
values.put(COLUMN_COST, new BigDecimal(delItem.get_cost()));
…我得到,“错误:找不到适合put的方法(String,BigDecimal)
方法ContentValues.put(字符串,字符串)不适用
(参数不匹配;无法将BigDecimal转换为字符串)
方法ContentValues.put(字符串,字节)不适用
(参数不匹配;无法将BigDecimal转换为字节)
方法ContentValues.put(String,Short)不适用
(参数不匹配;无法将BigDecimal转换为Short)
方法ContentValues.put(字符串,整数)不适用
(参数不匹配;无法将BigDecimal转换为整数)
方法ContentValues.put(字符串,长)不适用
(参数不匹配;无法将BigDecimal转换为Long)
方法ContentValues.put(字符串、浮点)不适用
(参数不匹配;无法将BigDecimal转换为浮点)
方法ContentValues.put(字符串,双精度)不适用
(参数不匹配;无法将BigDecimal转换为Double)
方法ContentValues.put(字符串,布尔值)不适用
(参数不匹配;无法将BigDecimal转换为布尔值)
方法ContentValues.put(字符串,字节[])不适用
(参数不匹配;无法将BigDecimal转换为字节[])
那么,如何操作中的BigDecimal值,以便ContentValues实例接受它呢
更新
我可能不得不暂时忽略这些VAL并将DDL更改为:
//+ COLUMN_COST + " REAL," + COLUMN_MARGIN + " REAL," + COLUMN_LISTPRICE + " REAL,"
+ COLUMN_COST + " REAL DEFAULT 0," + COLUMN_MARGIN + " REAL DEFAULT 0," + COLUMN_LISTPRICE + " REAL DEFAULT 0,"
有两种可能性:
字符串
double
,可以放入ContentValues
(将其自动装箱为double
)中。或者,您可以将其字符串表示形式存储在TEXT
列中。或者,您可以将unscaledValue()
和scale()
存储在两个INTEGER
列中
但SQLite最接近的匹配是真实的
不,不是
您似乎对在SQLite中存储定价数据感兴趣。在主要搜索引擎上搜索在SQLite中存储价格的
:
整数
列,以最小的单个货币单位定价(例如,美元货币值为美分),或其他适当的东西(例如,十分之一美分,如果这是最精细的价格粒度)
然后,POJO将保存要匹配的
int
值。我使用SQLite整数类型并进行如下转换:
BigDecimal bd = new BigDecimal("1234.5678");
int packedInt = bd.scaleByPowerOfTen(4).intValue(); // packedInt now = 12345678
现在将packedInt保存到SQLite整数字段
要返回到BigDecimal:
BigDecimal bd = new BigDecimal(packedInt); // bd = 12345678
bd = bd.scaleByPowerOfTen(-4); // now bd = 1234.5678
您是否尝试将其存储为字符串?否;这是唯一的解决方案吗?我正在尝试复制现有的(C#)投影到表结构。这些VAL是十进制的。Java的等价物是BigDecimal。但是SQLite最接近的匹配是REAL,但是很明显,对于REAL和BigDecimal,两者永远不会满足。然后使用
BigDecimal.floatValue()
或doubleValue()将其转换为float或double
为什么?如果它是真的,你应该用浮点计算值。或者更改列类型。不要只是对此加以掩饰,这是一个重大的设计错误。如果是钱,它必须以十进制计算并存储,而不是浮点。我喜欢“存储为int”的想法;这似乎是最简单和最“可靠”的将其存储为blob不起作用。当您将其存储为字符串时,如何检索它?
BigDecimal bd = new BigDecimal(packedInt); // bd = 12345678
bd = bd.scaleByPowerOfTen(-4); // now bd = 1234.5678