Android.database.sqlite.SQLiteException: нет такого столбца: 500.0 (код 1) - PullRequest
0 голосов
/ 29 декабря 2018

Уже 2 дня не могу найти ошибку.Я получаю эту ошибку, если нажимаю кнопку FloatingActionButton:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: de.pizza, PID: 32058
    android.database.sqlite.SQLiteException: no such column: 500.0 (code 1): , while compiling: INSERT INTO OrderDetail(ProductId,ProductName,Quantity,Price,Discount) VALUES('26','Margarita','1','500'.'0');
    #################################################################
    Error Code : 1 (SQLITE_ERROR)
    Caused By : SQL(query) error or missing database.
        (no such column: 500.0 (code 1): , while compiling: INSERT INTO OrderDetail(ProductId,ProductName,Quantity,Price,Discount) VALUES('26','Margarita','1','500'.'0');)
    #################################################################
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1096)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:661)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2109)
        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:2039)
        at de.pizza.Database.Database.addToCart(Database.java:60)
        at de.pizza.FoodDetail$1.onClick(FoodDetail.java:57)
        at android.view.View.performClick(View.java:6897)
        at android.view.View$PerformClick.run(View.java:26101)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Application terminated.

Я проверил свой запрос более 10 раз и ничего не могу найти: (

FoodDetail.java

 public List<Order> getCarts() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

    String[] sqlSelect = {"ProductName", "ProductId", "Quantity", "Price", "Discount"};
    String sqlTable = "OrderDetail";

    qb.setTables(sqlTable);
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);

    final List<Order> result = new ArrayList<>();
    if (c.moveToFirst()) {
        do {
            result.add(new Order(c.getString(c.getColumnIndex("ProductId")),
                    c.getString(c.getColumnIndex("ProductName")),
                    c.getString(c.getColumnIndex("Quantity")),
                    c.getString(c.getColumnIndex("Price")),
                    c.getString(c.getColumnIndex("Discount"))
            ));
        } while (c.moveToNext());
    }
    return result;
}

Database.java

public class Database extends SQLiteAssetHelper {
private static final String DB_NAME = "PBBANK.db";
private static int DB_VER = 1;

public Database(Context context) {
    super(context, DB_NAME, null, DB_VER);

}

public List<Order> getCarts() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

    String[] sqlSelect = {"ProductName", "ProductId", "Quantity", "Price", "Discount"};
    String sqlTable = "OrderDetail";

    qb.setTables(sqlTable);
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);

    final List<Order> result = new ArrayList<>();
    if (c.moveToFirst()) {
        do {
            result.add(new Order(c.getString(c.getColumnIndex("ProductId")),
                    c.getString(c.getColumnIndex("ProductName")),
                    c.getString(c.getColumnIndex("Quantity")),
                    c.getString(c.getColumnIndex("Price")),
                    c.getString(c.getColumnIndex("Discount"))
            ));
        } while (c.moveToNext());
    }
    return result;
}


public void addToCart(Order order)
{
    SQLiteDatabase db = getReadableDatabase();
    String query = String.format("INSERT INTO OrderDetail(ProductId,ProductName,Quantity,Price,Discount) VALUES('%s','%s','%s','%s'.'%s');",
            order.getProductId(),
            order.getProductName(),
            order.getQuantity(),
            order.getPrice(),
            order.getDiscount());
    db.execSQL(query);

}

public void cleanCart()
{
    SQLiteDatabase db = getReadableDatabase();
    String query = String.format("DELETE FROM ORDER OrderDetail");
    db.execSQL(query);

}
}

Снимок экрана моей базы данных SQLite

Я надеюсь, что моей информации достаточно, и кто-то может мне помочь.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Ваша проблема в том, что у вас есть точка, а не запятая, разделяющая значения для цена и скидка , и поэтому SQLite интерпретирует это как столбец.

Быстрое исправление будет состоять в том, чтобы изменить: -

String query = String.format("INSERT INTO OrderDetail(ProductId,ProductName,Quantity,Price,Discount) VALUES('%s','%s','%s','%s'.'%s');",
            order.getProductId(),
            order.getProductName(),
            order.getQuantity(),
            order.getPrice(),
            order.getDiscount());

на

String query = String.format("INSERT INTO OrderDetail(ProductId,ProductName,Quantity,Price,Discount) VALUES('%s','%s','%s','%s','%s');", //<<<<<<<<<< CHANGED
        order.getProductId(),
        order.getProductName(),
        order.getQuantity(),
        order.getPrice(),
        order.getDiscount());

Однако использование метода SQLiteDatabase insert уменьшит вероятность возникновения таких проблем, поэтомувышеприведенное может быть: -

public long addToCart(Order order)
{
    SQLiteDatabase db = getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put("ProductId",order.getProductId());
    cv.put("ProductName",order.getProductName());
    cv.put("Quantity",order.getQuantity());
    cv.put("Price",order.getPrice());
    cv.put("Discount",order.getDiscount());
    return db.insert("OrderDetail",null,cv);
}

Удобный метод insert имеет те преимущества, что

  • генерируется SQL,
  • захватывает и возвращает результат (идентификатор вставленной строки или, если строка не была вставлена ​​-1)
  • он использует INSERT OR IGNORE, поэтому не завершится ошибкой (бит вернет -1) если возникает конфликт ограничений (UNIQUE или NOT NULL).
0 голосов
/ 29 декабря 2018

У вас есть проблема внутри вашего SQL-запроса.Ваш последний параметр не запятая.Измените свою линию на:

С

'%s','%s','%s','%s'.'%s'

На

'%s','%s','%s','%s','%s'

Надеюсь, это поможет вам.Дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...