我有一堂这样的课:
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;
}
. . .
成本、利润和标价列均为“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 唯一的 float 据类型。
在扩展 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))”将整数值分配给 DeliveryItem 类,但对于 BigDecimal 值,我遇到了问题。
Java 的 BigDecimal 数据类型/类没有关联的“parseBigDecimal”方法。
如果我尝试这个:
d.set_cost(BigDecimal.valueOf(cursor.getString(6)));
我得到,“错误:没有找到适合 valueOf(String) 的方法 方法 BigDecimal.valueOf(long) 不适用 (参数不匹配;字符串无法转换为 long) 方法 BigDecimal.valueOf(double) 不适用 (参数不匹配;字符串无法转换为 double )"
...如果我尝试这个:
d.set_cost(Float.parseFloat(cursor.getString(6)));
...我得到,“错误:不兼容的类型:float 无法转换为 BigDecimal”
如果我尝试 Double.parseDouble(),我会得到类似的信息,“...double 无法转换为 BigDecimal”
如何从数据库中读取 REAL 并用这些值填充 BigDecimal 值?
更新
目前我什至无法用这个临时代码“伪造它直到我成功”:
d.set_cost(42.00);
...或者这个:
d.set_cost((BigDecimal)42.00);
...正如他们俩提示的那样,“错误:不兼容的类型:double 无法转换为 BigDecimal”
这种替代转换语法也是如此,Droidio建议:
d.set_cost(((BigDecimal) 42.00));
最佳答案
我不确定你为什么要尝试转换和/或使用 valueOf()
操作...只需创建一个新的 BigDecimal
对象。它确实有一个构造函数来接受 float 、 double 、字符串等。
d.set_cost(new BigDecimal(42.00));
:)
您还可以将 getString()
操作更改为 getBigDecimal()
。
就像:
d.set_cost(cursor.getBigDecimal(6));
这可以避免创建一个临时的(并且不必要的)String
,因为无论如何你似乎最终都会得到一个BigDecimal
。
请注意,如果您的 ResultSet
返回的值无法转换为 BigDecimal
(如字符串“abcd”),那么它将抛出 Exception
,但这可能是需要的,因为您正在处理错误数据。
关于java - 如何将 SQLite Real 值写入 Java BigDecimal 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23021176/