java - 如何将 SQLite Real 值写入 Java BigDecimal 值?

标签 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;
    }
    . . .

成本、利润和标价列均为“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/

相关文章:

java - 将字符串转换为大十进制的通用方法

java - 删除链接 jsoup 中的脚本

Java图形类命题

java - 停止 Spark 流

android - rawQuery 中的 ORMLite 别名

c++ - re write-sql statement Insert OR REPLACE 从java到c++ NDK Android

java - 对于大数字,从 DecimalFormat.format() 获取不正确的结果

java - com.sun.jersey.api.view.Viewable无法解析,它是从required.class间接引用的

android - SQLite 如何对字符进行排序?

java - 在 JAVA 中读取列表时,我们可以使用 .contains(BigDecimal.ZERO) 吗?