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

如何在Real(SQlite)列中存储BigDecimal(Java)值?

白驰
2023-03-14
问题内容

我仍然有BigDecimal的(眼泪开始跟踪大问题在这里,并继续在这里至今。

现在我遇到了相反的问题-从POJO中的BigDecimal到SQLite表中的REAL。

POJO定义为:

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

这段代码试图使数据形式正确,以便能够发布到SQLite表(其中相应的列是数据类型REAL,这是SQLite唯一的实数/浮点数据类型):

public long addDeliveryItem(DeliveryItem delItem) {
    long IdAdded = 0;
    ContentValues values = new ContentValues();
    values.put(COLUMN_INVOICENUM, delItem.get_invoiceNumber());
    values.put(COLUMN_UPCPLU, delItem.get_UPC_PLU());
    values.put(COLUMN_VENDORITEMID, delItem.get_vendorItemId());
    values.put(COLUMN_PACKSIZE, delItem.get_packSize());
    values.put(COLUMN_DESCRIPTION, delItem.get_description());
    //values.put(COLUMN_COST, delItem.get_cost());
    //values.put(COLUMN_COST, new BigDecimal(delItem.get_cost()));
    values.put(COLUMN_COST, (Double) delItem.get_cost());
    values.put(COLUMN_MARGIN, delItem.get_margin());
    values.put(COLUMN_LISTPRICE, delItem.get_listPrice());
    values.put(COLUMN_DEPTNUM, delItem.get_departmentNumber());
    values.put(COLUMN_SUBDEPT, delItem.get_subdepartment());
    values.put(COLUMN_QTY, delItem.get_quantity());

    SQLiteDatabase db = this.getWritableDatabase();

    if (db != null) {
        IdAdded = db.insert(TABLE_DELIVERYITEMS, null, values);
    }
    if (db != null) {
        db.close();
    }
    return IdAdded;
}

对于上面的COLUMN_COST行(“ MARGIN”和“ LISTPRICE”列具有相同的问题),当我尝试以下操作时,出现“
错误:不兼容的类型:BigDecimal无法转换为Double ”:

values.put(COLUMN_COST, (Double) delItem.get_cost());

…以及注释掉的代码(两行),即:

values.put(COLUMN_COST, delItem.get_cost());

…还有这个:

values.put(COLUMN_COST, new BigDecimal(delItem.get_cost()));

…我明白了,“
错误:找不到适合put(String,BigDecimal)方法的合适方法ContentValues.put(String,String)不适用(参数不匹配;
BigDecimal无法转换为String)方法ContentValues.put(String,Byte)不适用(参数不匹配;
BigDecimal无法转换为字节)方法ContentValues.put(String,Short)不适用(参数不匹配;
BigDecimal无法转换为Short)方法ContentValues.put(String,Integer)不适用(参数不匹配;
BigDecimal无法被转换为Integer)方法ContentValues.put(String,Long)不适用(参数不匹配;
BigDecimal无法转换为Long)方法ContentValues.put(String,Float)不适用(参数不匹配;
BigDecimal无法转换为Float)
)方法ContentValues.put(String,Double)不适用(html" target="_blank">参数不匹配;无法将BigDecimal转换为Double)方法ContentValues.put(String,Boolean)不适用(参数不匹配;不能将BigDecimal转换为Boolean)方法ContentValues.put(String,byte
[])不适用(参数不匹配; BigDecimal无法使用转换为byte [])

那么,如何在中操纵BigDecimal值,以便ContentValues实例可以接受它?

更新

我可能不得不暂时忽略它们,将DDL更改为:

//+ COLUMN_COST + " REAL,"  + COLUMN_MARGIN + " REAL," + COLUMN_LISTPRICE + " REAL,"
+ COLUMN_COST + " REAL DEFAULT 0,"  + COLUMN_MARGIN + " REAL DEFAULT 0," + COLUMN_LISTPRICE + " REAL DEFAULT 0,"

问题答案:

那么,如何在中操纵BigDecimal值,以便ContentValues实例可以接受它?

好了,您可以调用doubleValue()BigDecimal其降级为double,可以将其降级为(将其ContentValues自动装箱为Double)。或者,您可以将其字符串表示形式存储在TEXT列中。或者,您可以将unscaledValue()和存储scale()在两INTEGER列中。

但是SQLite最接近的匹配是REAL

不它不是。

您似乎对在SQLite中存储定价数据感兴趣。出现storing prices in sqlite在主要搜索引擎上的搜索:

  • 在SQLite3中存储货币值
  • https://dba.stackexchange.com/questions/15729/storing-prices-in-sqlite-what-data-type-to-use

共识是将值存储为一INTEGER列,以最小的单个货币单位定价(例如,以美元表示的货币价值为美分),或以其他方式存储适当的价格(例如,如果这是价格的最佳粒度,则为十分之一美分)
)。

然后,您的POJO将保存int要匹配的值。



 类似资料:
  • 问题内容: 我有一个这样的课: 成本,利润和标价列为“ BigDecimal”,因为在原始(C#)应用中,它们为Decimal 因此定义了相应的SQLite表: 最接近Decimal(C#)或BigDecimal(Java)的SQLite是REAL,这是SQLite唯一的浮点数据类型。 在扩展SQLiteOpenHelper的类中,我试图从表中选择值并将它们存储在我的自定义类类型的ArrayLis

  • 它们都存储3000.0,但我想为我的junit测试存储3000.00。不知道怎么做。

  • 问题内容: 如果我不需要localStorage,我的代码将如下所示: 这可行。但是,我需要将此变量存储在localStorage中,事实证明它很顽固。我试过了: 我要去哪里错了? 问题答案: 仅支持字符串。使用和。

  • 问题内容: 如何在SQLite数据库中存储JSON对象?正确的方法是什么? 一个地方是Blob类型列。如果我可以将JSON对象转换为字节数组并使用Fileoutputstream 另一个想法是将文本列存储为字符串 问题答案: 将JSONObject转换为String并另存为TEXT / VARCHAR。 在检索同一列时,将String转换为JSONObject。 例如 写入数据库 从数据库读取

  • 问题内容: 如果我不需要localStorage,我的代码将如下所示: 这可行。但是,我需要将此变量存储在localStorage中,事实证明它很顽固。我试过了: 我要去哪里错了? 问题答案: 仅支持字符串。使用和。

  • 问题内容: 我的哈希图将字符串存储为键,将arraylist存储为值。现在,我需要将其嵌入到列表中。也就是说,它将具有以下形式: 这些是我使用的声明: 谁能帮我在列表中使用哪种方法以及如何继续将地图存储到其中? 问题答案: 始终尝试在Collection中使用接口引用 ,这会增加灵活性。 以下代码有什么问题? 您可以像上面一样轻松地进行操作。