如何在Real(SQlite)列中存储BigDecimal(Java)值?
问题内容:
我仍然有BigDecimal的(眼泪开始跟踪大问题在这里,并继续在这里至今。
现在我遇到了相反的问题-从POJO中的BigDecimal到SQLite表中的REAL。
POJO定义为:
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唯一的实数/浮点数据类型):
public long addDeliveryItem(DeliveryItem delItem) {
long IdAdded = 0;
ContentValues values = new ContentValues();
values.put(COLUMN_INVOICENUM, delItem.get_invoiceNumber());
values.put(COLUMN_UPCPLU, delItem.get_UPC_PLU());
values.put(COLUMN_VENDORITEMID, delItem.get_vendorItemId());
values.put(COLUMN_PACKSIZE, delItem.get_packSize());
values.put(COLUMN_DESCRIPTION, delItem.get_description());
//values.put(COLUMN_COST, delItem.get_cost());
//values.put(COLUMN_COST, new BigDecimal(delItem.get_cost()));
values.put(COLUMN_COST, (Double) delItem.get_cost());
values.put(COLUMN_MARGIN, delItem.get_margin());
values.put(COLUMN_LISTPRICE, delItem.get_listPrice());
values.put(COLUMN_DEPTNUM, delItem.get_departmentNumber());
values.put(COLUMN_SUBDEPT, delItem.get_subdepartment());
values.put(COLUMN_QTY, delItem.get_quantity());
SQLiteDatabase db = this.getWritableDatabase();
if (db != null) {
IdAdded = db.insert(TABLE_DELIVERYITEMS, null, values);
}
if (db != null) {
db.close();
}
return IdAdded;
}
对于上面的COLUMN_COST行(“ MARGIN”和“ LISTPRICE”列具有相同的问题),当我尝试以下操作时,出现“
错误:不兼容的类型:BigDecimal无法转换为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(String,String)不适用(参数不匹配;
BigDecimal无法转换为String)方法ContentValues.put(String,Byte)不适用(参数不匹配;
BigDecimal无法转换为字节)方法ContentValues.put(String,Short)不适用(参数不匹配;
BigDecimal无法转换为Short)方法ContentValues.put(String,Integer)不适用(参数不匹配;
BigDecimal无法被转换为Integer)方法ContentValues.put(String,Long)不适用(参数不匹配;
BigDecimal无法转换为Long)方法ContentValues.put(String,Float)不适用(参数不匹配;
BigDecimal无法转换为Float)
)方法ContentValues.put(String,Double)不适用(参数不匹配;无法将BigDecimal转换为Double)方法ContentValues.put(String,Boolean)不适用(参数不匹配;不能将BigDecimal转换为Boolean)方法ContentValues.put(String,byte
[])不适用(参数不匹配; BigDecimal无法使用转换为byte []) ”
那么,如何在中操纵BigDecimal值,以便ContentValues实例可以接受它?
更新
我可能不得不暂时忽略它们,将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,"
问题答案:
那么,如何在中操纵BigDecimal值,以便ContentValues实例可以接受它?
好了,您可以调用doubleValue()
将BigDecimal
其降级为double
,可以将其降级为(将其ContentValues
自动装箱为Double
)。或者,您可以将其字符串表示形式存储在TEXT
列中。或者,您可以将unscaledValue()
和存储scale()
在两INTEGER
列中。
但是SQLite最接近的匹配是REAL
不它不是。
您似乎对在SQLite中存储定价数据感兴趣。出现storing prices in sqlite
在主要搜索引擎上的搜索:
- 在SQLite3中存储货币值
- https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use
共识是将值存储为一INTEGER
列,以最小的单个货币单位定价(例如,以美元表示的货币价值为美分),或以其他方式存储适当的价格(例如,如果这是价格的最佳粒度,则为十分之一美分)
)。
然后,您的POJO将保存int
要匹配的值。