我仍然有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
在主要搜索引擎上的搜索:
共识是将值存储为一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中使用接口引用 ,这会增加灵活性。 以下代码有什么问题? 您可以像上面一样轻松地进行操作。