我有一个这样的课程:
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;
}
. . .
费用,保证金和listprice列是“BigDecimal”,因为在原始(C#)应用they were Decimal
因此定义了相应的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"
+ ")";
最接近的SQLite获得Decimal(C#)或BigDecimal(Java)是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类分配字符串值,使用“ 整数”将整数值分配给整数值。 parseInt(cursor.getString(0)) “但是对于BigDecimal值,我遇到了一个问题。
Java的BigDecimal数据类型/类没有关联的“parseBigDecimal”方法。
如果我试试这个:
d.set_cost(BigDecimal.valueOf(cursor.getString(6)));
我明白了,“错误:没有为valueOf(String)找到合适的方法 方法BigDecimal.valueOf(long)不适用 (参数不匹配; String不能转换为long) 方法BigDecimal.valueOf(double)不适用 (参数不匹配; String不能转换为double)“
......如果我试试这个:
d.set_cost(Float.parseFloat(cursor.getString(6)));
...我明白了,“错误:不兼容的类型:float无法转换为BigDecimal ”
如果我尝试Double.parseDouble(),我会得到类似的,“ ... double无法转换为BigDecimal ”
如何从数据库中读取REAL并使用这些val填充BigDecimal val?
我现在甚至无法使用这个临时代码来“假装它”:
d.set_cost(42.00);
......或者这个:
d.set_cost((BigDecimal)42.00);
......因为他们两个都抱怨,“错误:不兼容的类型:double无法转换为BigDecimal”
这种替代转换语法也是如此,Droidio建议:
d.set_cost(((BigDecimal) 42.00));
答案 0 :(得分:1)
我不确定您为什么要投射和/或使用valueOf()
操作...只需创建一个新的BigDecimal
对象。它有一个构造函数来获取float,double,string等。
d.set_cost(new BigDecimal(42.00));
:)
您也可以将getString()
操作更改为getBigDecimal()
。
所以喜欢:
d.set_cost(cursor.getBigDecimal(6));
这样可以创建一个临时(和不必要的)String
,因为你似乎最终得到BigDecimal
之后。
请注意,如果您的ResultSet
返回的值无法转换为BigDecimal
,则表示字符串&#34; abcd&#34;那么它会抛出一个Exception
,但这可能是你想要的,因为你正在处理坏数据。