2016-11-09 35 views
0

查询失败更新(更新为0):与参数化的Android SQLite的UPDATE WHERE不起作用

int updated = db.update(TABLE_NAME, values, 
    COLUMN_NAME_ACCOUNT_ID + "= ? AND " + COLUMN_NAME_TOPIC + "= ?", 
    new String[] { String.valueOf(id), name }); 

但是,这只是正常工作,更新= 1:

int updated = db.update(TABLE_NAME, values, 
    COLUMN_NAME_ACCOUNT_ID + "=" + id + 
     " AND " + COLUMN_NAME_TOPIC + "='" + name + "'", 
    null); 

唯一的区别WHERE是如何构建的 - 显式地或通过参数。这是怎么回事?

SQLite 3.8.10.2有货的Android模拟器。

+0

在第二个例子中,你引用了'name'值 –

+1

是,在“名称”是一个字符串,所以我引用它。在第一个例子中,SQLite应该自动引用它,不是吗? –

+0

我试过这个: COLUMN_NAME_ACCOUNT_ID +“=?AND”+ COLUMN_NAME_TOPIC +“='?'”, –

回答

0

account_id列包含数字。与字符串(String.valueOf(id))的比较永远不会成功。

Android的数据库API只支持字符串参数在这里,所以你必须直接将ID为字符串:

int updated = db.update(TABLE_NAME, values, 
     COLUMN_NAME_ACCOUNT_ID + "=" + id + " AND " + COLUMN_NAME_TOPIC + "= ?", 
     new String[] { name }); 
+0

sqlite并不关心类型 – njzk2

+0

它不完全是苹果,但是这里有一个谷歌代码示例,它使用参数化查询比较数字字段和字符串:https://github.com/googlesamples/android-BasicSyncAdapter /blob/master/Application/src/main/java/com/example/android/basicsyncadapter/provider/FeedProvider.java#L194 –

+0

只有当列中有正确的[affinity](http://www.sqlite.org /datatype3.html#affinity);你的没有。 –