SQLite - не удается обновить строку с длинным текстом для столбца id - PullRequest
0 голосов
/ 15 апреля 2019

Итак, я работаю над этим приложением Inventory Management в Android Studio и испытываю трудности с добавлением определенного количества продукта в базу данных. У меня есть метод в моем классе базы данных под названием updateQuantity. Он берет номер штрих-кода и сумму, которую нужно добавить, и он должен обновлять количество продуктов.

private static final String TABLE_PRODUCT = "product";

private static final String COLUMN_PRODUCT_BARCODE_NUMBER = "barcode_number"; // TEXT
private static final String COLUMN_PRODUCT_QUANTITY = "quantity"; // INTEGER
private static final String COLUMN_PRODUCT_NAME = "name"; // TEXT
private static final String COLUMN_PRODUCT_PURCHASE_PRICE = "purchase_price"; //INTEGER
private static final String COLUMN_PRODUCT_SALE_PRICE = "sale_price"; // INTEGER

public boolean updateQuantity(String barcode, int amount) {
    SQLiteDatabase db = this.getWritableDatabase();

    String query = "UPDATE " + TABLE_PRODUCT + " SET " + COLUMN_PRODUCT_QUANTITY +
                   " = ((SELECT " + COLUMN_PRODUCT_QUANTITY + " FROM " +
                   TABLE_PRODUCT + " WHERE " + COLUMN_PRODUCT_BARCODE_NUMBER +
                   " = " + barcode + ") + " + amount + ") WHERE " +
                    COLUMN_PRODUCT_BARCODE_NUMBER + " = " + barcode;
    try {
        db.execSQL(query);
    } catch (Exception e) {
        return false;
    }
    return true;
}`

Работает с продуктом, у которого есть номер штрих-кода "86938693", но не выполняет какое-либо обновление количества для продукта, у которого есть номер штрих-кода "8690632034614". В чем здесь проблема?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы создали очень сложный оператор SQL, но он должен быть намного проще:

String query = 
    "UPDATE " + TABLE_PRODUCT + 
    " SET " + COLUMN_PRODUCT_QUANTITY + " = " + COLUMN_PRODUCT_QUANTITY + " + " + amount + 
    " WHERE " +  COLUMN_PRODUCT_BARCODE_NUMBER + " = '" + barcode + "'";

Вам не нужно дважды искать таблицу, чтобы получить значение, которое вы хотите обновить.Также значение переменной штрих-кода должно быть заключено в одинарные кавычки, так как это строка.Если есть случай, когда значение столбца COLUMN_PRODUCT_QUANTITY равно NULL, то вы должны использовать coalesce():

String query = 
    "UPDATE " + TABLE_PRODUCT + 
    " SET " + COLUMN_PRODUCT_QUANTITY + " = coalesce(" + COLUMN_PRODUCT_QUANTITY + ", 0) + " + amount + 
    " WHERE " +  COLUMN_PRODUCT_BARCODE_NUMBER + " = '" + barcode + "'";
0 голосов
/ 15 апреля 2019

«86938693» может быть преобразовано в long int, но «8690632034614» не может.Я подозреваю, что SQLite выполняет неявное преобразование значения, которое вы дали, в то, что он обычно ожидает для первичного ключа, который является длинным целым числом, независимо от того, как определен столбец (да, SQLite делает это).Если первичный ключ вашего SQLite определен в столбце, который не является длинным целым числом, существуют такие случаи, как этот, когда таблица будет считаться доступной только для чтения и обновления завершатся неудачно.

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