Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite-无法更新id列具有长文本的行_Android_Sqlite_Sql Update - Fatal编程技术网

Android SQLite-无法更新id列具有长文本的行

Android SQLite-无法更新id列具有长文本的行,android,sqlite,sql-update,Android,Sqlite,Sql Update,因此,我正在Android Studio上开发这个库存管理应用程序,在向数据库中添加一定数量的产品时遇到了问题。我的数据库类中有一个名为updateQuantity的方法。它需要添加一个条形码号和一个数量,并且应该更新产品数量。 private static final String TABLE_PRODUCT = "product"; private static final String COLUMN_PRODUCT_BARCODE_NUMBER = "barcode_number"; /

因此,我正在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”的产品进行任何数量更新。这里的问题是什么?

您创建了一个非常复杂的sql语句,但应该简单得多:

String query = 
    "UPDATE " + TABLE_PRODUCT + 
    " SET " + COLUMN_PRODUCT_QUANTITY + " = " + COLUMN_PRODUCT_QUANTITY + " + " + amount + 
    " WHERE " +  COLUMN_PRODUCT_BARCODE_NUMBER + " = '" + barcode + "'";
不必搜索两次表就可以获得要更新的值
此外,变量条形码的值必须用单引号括起来,因为它是一个字符串。
如果列
列产品数量的值
,则必须使用:


“86938693”可以转换为长整数,但“8690632034614”不能。我怀疑SQLite正在将您给定的值隐式转换为它通常期望的主键,即长整数,而不管列定义为什么(是的,SQLite会这样做)。如果SQLite的主键是在非长整数的列上定义的,则在某些情况下(如本例),表将被视为只读,更新将失败。

如果您检查异常而不是忽略它,它将给您一个关于发生了什么的提示。我更怀疑查询是否适用于任何情况,因为您没有在字符串周围添加任何
。也许系统会进行一些自动转换,将字符串列与给定的数字进行比较(因为如果没有“您的条形码在查询中被视为数字”),当数字变得太大时会失败。不要尝试将未知字符串值直接粘贴到SQL语句中;将值绑定到参数。有关详细信息,请参阅您的文档。它不会引发任何异常,并且将
添加到
条形码
的侧面不会更改任何内容,因此您的方法返回true?您确定两个表中都包含带有该条形码的记录吗?您的条形码列是否具有固定宽度?这完全是关于数量值为空。下面的代码对我有用,谢谢。
String query = 
    "UPDATE " + TABLE_PRODUCT + 
    " SET " + COLUMN_PRODUCT_QUANTITY + " = coalesce(" + COLUMN_PRODUCT_QUANTITY + ", 0) + " + amount + 
    " WHERE " +  COLUMN_PRODUCT_BARCODE_NUMBER + " = '" + barcode + "'";