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

如何在实(SQlite)列中存储BigDecimal(Java)值?,java,android,sqlite,bigdecimal,Java,Android,Sqlite,Bigdecimal,我对BigDecimal仍然有很大的问题(眼泪的痕迹开始了,一直持续到现在) 现在我遇到了相反的问题——从POJO中的BigDecimal到SQLite表中的REAL POJO定义为: public class DeliveryItem { private int _id; private String _invoiceNumber; private String _UPC_PLU; private String _vendorItemId; privat

我对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唯一的REAL/float数据类型):

对于上面的列_COST line(“MARGIN”和“LISTPRICE”列有相同的问题),我在尝试以下操作时得到“error:不兼容的类型:bigdecim无法转换为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(字符串,字符串)不适用 (参数不匹配;无法将BigDecimal转换为字符串) 方法ContentValues.put(字符串,字节)不适用 (参数不匹配;无法将BigDecimal转换为字节) 方法ContentValues.put(String,Short)不适用 (参数不匹配;无法将BigDecimal转换为Short) 方法ContentValues.put(字符串,整数)不适用 (参数不匹配;无法将BigDecimal转换为整数) 方法ContentValues.put(字符串,长)不适用 (参数不匹配;无法将BigDecimal转换为Long) 方法ContentValues.put(字符串、浮点)不适用 (参数不匹配;无法将BigDecimal转换为浮点) 方法ContentValues.put(字符串,双精度)不适用 (参数不匹配;无法将BigDecimal转换为Double) 方法ContentValues.put(字符串,布尔值)不适用 (参数不匹配;无法将BigDecimal转换为布尔值) 方法ContentValues.put(字符串,字节[])不适用 (参数不匹配;无法将BigDecimal转换为字节[])

那么,如何操作中的BigDecimal值,以便ContentValues实例接受它呢

更新 我可能不得不暂时忽略这些VAL并将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,"

有两种可能性:

  • 将其存储为
    字符串
  • 将其存储为Blob。BigDecimal是可序列化的,因此应该可以工作
  • 第一个问题应该是直截了当的,第二个问题我会向你提出一个关于类似主题的很好的问题

    那么,如何操作中的BigDecimal值,以便ContentValues实例接受它呢

    您可以将其降级为
    double
    ,可以放入
    ContentValues
    (将其自动装箱为
    double
    )中。或者,您可以将其字符串表示形式存储在
    TEXT
    列中。或者,您可以将
    unscaledValue()
    scale()
    存储在两个
    INTEGER
    列中

    但SQLite最接近的匹配是真实的

    不,不是

    您似乎对在SQLite中存储定价数据感兴趣。在主要搜索引擎上搜索在SQLite中存储价格的

    一致意见是将值存储为
    整数
    列,以最小的单个货币单位定价(例如,美元货币值为美分),或其他适当的东西(例如,十分之一美分,如果这是最精细的价格粒度)


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

    我使用SQLite整数类型并进行如下转换:

    BigDecimal bd = new BigDecimal("1234.5678");
    
    int packedInt = bd.scaleByPowerOfTen(4).intValue(); // packedInt now = 12345678
    
    现在将packedInt保存到SQLite整数字段

    要返回到BigDecimal:

    BigDecimal bd = new BigDecimal(packedInt); // bd = 12345678
    
    bd = bd.scaleByPowerOfTen(-4);             // now bd = 1234.5678
    

    您是否尝试将其存储为字符串?否;这是唯一的解决方案吗?我正在尝试复制现有的(C#)投影到表结构。这些VAL是十进制的。Java的等价物是BigDecimal。但是SQLite最接近的匹配是REAL,但是很明显,对于REAL和BigDecimal,两者永远不会满足。然后使用
    BigDecimal.floatValue()
    doubleValue()将其转换为float或double
    为什么?如果它是真的,你应该用浮点计算值。或者更改列类型。不要只是对此加以掩饰,这是一个重大的设计错误。如果是钱,它必须以十进制计算并存储,而不是浮点。我喜欢“存储为int”的想法;这似乎是最简单和最“可靠”的将其存储为blob不起作用。当您将其存储为字符串时,如何检索它?
    BigDecimal bd = new BigDecimal(packedInt); // bd = 12345678
    
    bd = bd.scaleByPowerOfTen(-4);             // now bd = 1234.5678