如何将SQLite Real vals写入Java BigDecimal值?

时间:2014-04-11 19:34:21

标签: java android-sqlite bigdecimal type-conversion sqliteopenhelper

我有一个这样的课程:

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));

1 个答案:

答案 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,但这可能是你想要的,因为你正在处理坏数据。