![](/img/trans.png)
[英]How can I store a BigDecimal (Java) value in a Real (SQlite) column?
[英]How can I write SQLite Real vals to Java BigDecimal values?
我有这样的课:
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;
}
public int getID() {
return this._id;
}
. . .
成本,利润和标价列为“大十进制 ”,因为在原始(C#)应用中, 它们为十进制
因此定义了相应的SQLite表:
String CREATE_DELIVERYITEMS_TABLE = "CREATE TABLE " +
TABLE_DELIVERYITEMS + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_INVOICENUM + " TEXT,"
+ COLUMN_UPCPLU + " TEXT," + COLUMN_VENDORITEMID + " TEXT,"
+ COLUMN_PACKSIZE + " INTEGER," + COLUMN_DESCRIPTION + " TEXT," + COLUMN_COST +
" REAL,"
+ COLUMN_MARGIN + " REAL," + COLUMN_LISTPRICE + " REAL," + COLUMN_DEPTNUM + "
INTEGER,"
+ COLUMN_SUBDEPT + " TEXT," + COLUMN_QTY + " TEXT"
+ ")";
最接近Decimal(C#)或BigDecimal(Java)的SQLite是REAL,这是SQLite唯一的浮点数据类型。
在扩展SQLiteOpenHelper的类中,我试图从表中选择值并将它们存储在我的自定义类类型的ArrayList中,如下所示:
public ArrayList<DeliveryItem> getAllDeliveryItems() {
ArrayList<DeliveryItem> delItems = new ArrayList<DeliveryItem>();
String query = "Select * FROM " + TABLE_DELIVERYITEMS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db != null ? db.rawQuery(query, null) : null;
if (cursor != null) {
while (cursor.moveToNext()) {
DeliveryItem d = new DeliveryItem();
d.setID(Integer.parseInt(cursor.getString(0)));
. . .
d.set_cost(BigDecimal.valueOf(cursor.getString(6)));
d.set_margin(BigDecimal.valueOf(cursor.getString(7)));
d.set_listPrice(BigDecimal.valueOf(cursor.getString(8)));
. . .
delItems.add(d);
}
}
if (cursor != null) {
cursor.close();
}
return delItems;
}
请注意,我可以使用“ cursor.getString(N) ”将字符串值分配给DeliveryItem类,并使用“ Integer.parseInt(cursor.getString(0)) ”将整数值分配给我,但是对于BigDecimal值,我遇到了问题。
Java的BigDecimal数据类型/类没有关联的“ parseBigDecimal”方法。
如果我尝试这样做:
d.set_cost(BigDecimal.valueOf(cursor.getString(6)));
我得到“ 错误:找不到适用于valueOf(String)方法的合适方法Method BigDecimal.valueOf(long)不适用(参数不匹配;字符串不能转换为long)方法BigDecimal.valueOf(double)不适用(参数不匹配;字符串不能转换为double) “
...如果我尝试这样做:
d.set_cost(Float.parseFloat(cursor.getString(6)));
...我得到了“ 错误:不兼容的类型:浮点数不能转换为BigDecimal ”
如果我尝试Double.parseDouble(),则会得到类似的结果,“ ... double无法转换为BigDecimal ”
如何从数据库中读取REAL,并使用这些val填充BigDecimal val?
目前,我什至无法使用此临时代码“伪造它,直到完成”:
d.set_cost(42.00);
...或这个:
d.set_cost((BigDecimal)42.00);
...因为他们俩都抱怨“错误:类型不兼容:双精度不能转换成BigDecimal”
d.set_cost(((BigDecimal) 42.00));
我不确定您为什么要尝试强制转换和/或使用valueOf()
操作...只是简单地创建一个新的BigDecimal
对象。它确实具有一个构造函数,可以使用浮点数,双精度数,字符串等。
d.set_cost(new BigDecimal(42.00));
:)
您还可以将getString()
更改为getBigDecimal()
。
像这样:
d.set_cost(cursor.getBigDecimal(6));
这样就可以创建一个临时(且不必要)的String
因为无论如何您似乎最终都得到了BigDecimal
。
请注意,如果您的ResultSet
返回的值不能像字符串“ abcd”那样转换为BigDecimal
,则它将引发Exception
,但这可能是需要的,因为您随后将处理错误的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.