我尝试了以下SQLite查询:
int idServizo = 150;
String whereClause = id_servizio+" = '"+idServizio+" ' ";
ContentValues cv = new ContentValues();
cv.put("sync", 1);
int r = dbManager.updateTable("myTable", cv, whereClause);
其中字段sync和id_servizio都是整数。 updateTable方法是:
public int updateTable(String table, ContentValues values, String whereClause){
int r = mDb.update(table, values, whereClause, null);
return r;
}
// mDb is SQLiteDatabase object
这一切都很好。 但是如果我用rawQuery()方法尝试这个:
public Cursor RawQuery(String sqlQuery, String[] columns){
return mDb.rawQuery(sqlQuery, columns);
}
表格未更新!即使没有发生错误。
int idServizo = 150;
String updateQuery ="UPDATE myTable SET sync = 1 WHERE id_servizio = "+idServizio;
dbManager.RawQuery(updateQuery, null);
为什么这不起作用?
答案 0 :(得分:34)
这是因为当执行rawQuery时会返回游标。如果不调用cursor.moveToFirst()
和cursor.close()
,数据库将不会更新。
int idServizo = 150;``
String updateQuery ="UPDATE myTable SET sync = 1 WHERE id_servizio = "+idServizio;
Cursor c= dbManager.RawQuery(updateQuery, null);
c.moveToFirst();
c.close();
我不知道需要调用moveToFirst(),但这样可以正常运行并且数据库会更新。
答案 1 :(得分:6)
问题解决了。
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
无效,因为rawQuery
运行提供的SQL并在结果集上返回Cursor
。
如果我想退回一张桌子,我必须使用rawQuery
,否则不要!
答案 2 :(得分:4)
您应该使用db.execSQL()而不是db.rawQuery()。
答案 3 :(得分:2)
您的update
来电将ID格式化为字符串,而rawQuery
来电格式为数字。
假设表中的ID确实是一个字符串,请使用:
String updateQuery = "UPDATE myTable SET sync = 1 WHERE id_servizio = '" + idServizio + "'";
答案 4 :(得分:1)
代替这样做:
Cursor c= dbManager.RawQuery(updateQuery, null);
c.moveToFirst();
c.close();
您只需要这个:
dbManager.execSQL(updateQuery, null);
发布答案,因为有时很多人(例如我)不阅读评论。 最受欢迎的答案不正确,但是Yaqub Ahmad's评论正确。
CommonsWare中对this answer的回答:
rawQuery()用于返回结果集的SQL语句。采用 execSQL()用于不返回结果的SQL语句(如INSERT) 组。
public void execSQL (String sql)
执行不是SELECT的单个SQL语句或返回数据的任何其他SQL语句。
public Cursor rawQuery (String sql,
String[] selectionArgs)
运行提供的SQL并在结果集上返回游标。