У меня есть такой класс:
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#) приложении они были десятичными
Соответствующая таблица 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 с плавающей запятой.
В классе, который расширяет 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;
}
Обратите внимание, что я могу назначить строковые значения классу DeliveryItem, используя "cursor.getString(N)", и целочисленные значения, используя "Integer.parseInt(cursor .getString(0))", но что касается значений BigDecimal, у меня возникла проблема.
Тип/класс данных BigDecimal в Java не имеет связанного с ним метода parseBigDecimal.
Если я попробую это:
d.set_cost(BigDecimal.valueOf(cursor.getString(6)));
Я получаю: "ошибка: не найден подходящий метод для метода valueOf(String) BigDecimal.valueOf(long) неприменим (несоответствие аргументов; строка не может быть преобразована в long) метод BigDecimal.valueOf(double) неприменим ( несоответствие аргумента; строка не может быть преобразована в двойную)"
... и если я попробую это:
d.set_cost(Float.parseFloat(cursor.getString(6)));
... я получаю "ошибка: несовместимые типы: число с плавающей запятой не может быть преобразовано в BigDecimal"
Если я попробую Double.parseDouble(), я получу нечто похожее: "...double не может быть преобразовано в BigDecimal"
Как я могу прочитать REAL из базы данных и заполнить значения BigDecimal этими значениями?
ОБНОВИТЬ
В настоящее время я даже не могу «притворяться, пока не сделаю» с помощью этого временного кода:
d.set_cost(42.00);
...или это:
d.set_cost((BigDecimal)42.00);
... как они оба жалуются, "ошибка: несовместимые типы: двойной не может быть преобразован в BigDecimal"
И то же самое касается этого альтернативного синтаксиса приведения, который Droidio предложенный:
d.set_cost(((BigDecimal) 42.00));
BigDecimal
какd.set_cost(new BigDecimal(42.00));
- person SnakeDoc   schedule 12.04.2014