我正在尝试在android中建立一个SQLite数据库,但是我有一个问题:
我正在尝试更新ID为0的“响应”列中的文本值。我遇到的第一个问题是,我用于更新的字符串使用了撇号('),并且语法错误,因为sql以'结束字符串。所以我现在为此使用准备好的sql语句。现在的问题是,返回的long给出了-1,这意味着没有行受到影响。那么如何将当前字符串更新为id = 0的行?
注意:第一个字符串也有一个',但使用addData函数添加了它,仅使用db.insert并没有给出任何错误,是这个问题,我应该替换所有我的带有预准备语句的代码?
public boolean addData(String item) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL2, item);
Log.d(TAG, "addData: Adding " + item + " to " + TABLE_NAME);
long result = db.insert(TABLE_NAME, null, contentValues);
//if date as inserted incorrectly it will return -1
if (result == -1) {
return false;
} else {
return true;
}
}
public long updateData(String newName){
SQLiteDatabase db = this.getWritableDatabase();
String sql = "UPDATE json_response SET response=? WHERE ID='0'";
SQLiteStatement statement = db.compileStatement(sql);
statement.bindString(1, newName); // matches second '?' in sql string
long rowId = statement.executeInsert();
return rowId;
}
答案 0 :(得分:2)
我没有使用准备好的语句,所以我不能说为什么它不起作用,但是为什么不使用db.update()方法呢?它采用ContentValues作为参数,类似于tour addData()方法。试一试。
public int updateData(String newName){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("json_response",newName);
int rows = db.update(TABLE_NAME, cv, "ID=0", null);
return rows;
}
[EDIT] update()返回一个整数,该整数表示受影响的行数,而不是受影响的行数。请记住这一点,因为变量名rowId表示这不是您要查找的内容。
[编辑2]并且不,我看到的addData()方法没有问题。添加的撇号不会导致错误,因为ContentValues在将字符串值添加到数据库之前会对其进行参数化。基本上,插入值时将忽略所有类似SQL的语法,这出于安全性考虑而非常有用。
答案 1 :(得分:1)
我认为问题是WHERE ID='0'
总是会失败;您想要的是WHERE ID=0