当前位置: 首页 > 面试题库 >

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

燕朝明
2023-03-14
问题内容

我有一个这样的课:

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#)应用中,它们为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"
        + ")";

最接近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)方法BigDecimal.valueOf(long)的合适方法不适用(参数不匹配;字符串无法转换为long)方法BigDecimal.valueOf(double)不适用(参数不匹配;字符串不能转换为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);

…因为他们俩都抱怨“错误:类型不兼容:双精度不能转换成BigDecimal”

Droidio建议的替代转换语法也是如此:

d.set_cost(((BigDecimal) 42.00));

问题答案:

我不确定为什么要尝试强制转换和/或使用valueOf()操作…只是简单地创建一个新BigDecimal对象。它的确有一个构造函数可以使用float,double,string等。

d.set_cost(new BigDecimal(42.00));

:)

您也可以将操作getString()符更改为getBigDecimal()

像这样:

d.set_cost(cursor.getBigDecimal(6));

这样就可以创建一个临时的(并且是不必要的),String因为BigDecimal无论如何您似乎最终还是要这样做的。

请注意,如果您ResultSet返回的值不能转换为BigDecimal字符串“ abcd”之类的值,它将抛出一个Exception,但这可能是需要的,因为您随后将处理错误的数据。



 类似资料:
  • 问题内容: 我有一个问题-如何将结果/数据库选择写入JTextArea。我的JButton的方法是: 如果使用 -在控制台中看到输出,但是如何将Text设置为JTextArea? 问题答案: 请参阅文档。

  • 问题内容: 有 DataFrame.to_sql 方法,但仅适用于mysql,sqlite和oracle数据库。我无法传递给此方法postgres连接或sqlalchemy引擎。 问题答案: 从pandas 0.14(2014年5月发行)开始,支持postgresql。该模块现在用于支持不同的数据库风格。您可以为PostgreSQL数据库传递sqlalchemy引擎(请参阅docs)。例如: 您是

  • 我试图将写入并关注了其他几个博客,其中一个就是这个,但它不起作用。 但是,我可以成功地从读取数据为。此外,一些帖子使用了格式,其他帖子使用了格式。我不确定该用哪一个。;;和从这里开始。 守则如下: 这里有个例外: 在org.apache.hadoop.hbase.security.userprovider.instantiate(userprovider.java:122)在org.apache.

  • 问题内容: 我有一个java.sql.Blob的JPA实体: 如何创建该实体的实例?我想设置与方法,但如何让从JPA?只是接口,对于不同的数据库有不同的实现,因此我认为JPA应该给我正确的实现。如何获得? 问题答案: 使用字节数组: 如果要使用流,请使用以下命令创建Blob:

  • 问题内容: 我正在尝试使用Go写入日志文件。 我尝试了几种方法,但都失败了。这是我尝试过的: 日志文件被创建,但是没有任何打印或附加到该文件。为什么? 问题答案: 过去的工作方式一定不同,但这对我有用: 基于Go文档,不能用于,因为它会打开文件“供阅读:” 打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode 。如果有错误,它将是类型。 编辑 检查后移至

  • 问题内容: 我试图将XML 存储到XML文件中,以便稍后可以检索信息,然后将其显示回控制台。 有人可以告诉我最有效的方法吗? 编辑: 这是我要写入外​​部文件的内容 这一切都创建了一个Bank用户,该用户被扔到中,然后我想存储他们的信息,以便稍后返回并重新显示。 问题答案: //根据需要修改下面的类 //下面的类实际写了