12

我尝试了以下 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);

为什么这不起作用?

4

5 回答 5

45

这是因为在执行 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() 但这工作正常并且数据库得到更新。

于 2014-12-15T11:27:56.287 回答
7

问题解决了。

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

无法工作,因为rawQuery运行提供的 SQL 并返回Cursor结果集。

如果我想返回我必须使用的表rawQuery,否则不!

在android/sqlite数据库中增加一条记录的值

于 2012-10-24T10:37:04.060 回答
5

您应该使用 db.execSQL() 而不是 db.rawQuery()。

于 2017-09-26T14:10:09.693 回答
4

而不是这样做:

Cursor c= dbManager.RawQuery(updateQuery, null);
c.moveToFirst();
c.close();

你只需要这个:

dbManager.execSQL(updateQuery, null);

-------------------------------------------------- --------------------------

发布答案是因为有时很多人(比如我)不阅读评论。最受欢迎的答案不正确,但Yaqub Ahmad 的评论是正确的。

CommonsWare的答案在此答案中解释:

rawQuery() 用于返回结果集的 SQL 语句。对不返回结果集的 SQL 语句(如 INSERT)使用 execSQL()。

-------------------------------------------------- --------------------------

execSQL 的文档:

public void execSQL (String sql)

执行不是 SELECT 的单个 SQL 语句或任何其他返回数据的 SQL 语句。

rawQuery 的文档:

public Cursor rawQuery (String sql, 
                String[] selectionArgs)

运行提供的 SQL 并返回结果集上的 Cursor。

于 2018-07-04T16:32:24.590 回答
2

您的update呼叫将 ID 格式化为字符串,而rawQuery呼叫格式为数字。

假设表中的 ID 确实是一个字符串,请使用:

String updateQuery = "UPDATE myTable SET sync = 1 WHERE id_servizio = '" + idServizio + "'";
于 2012-10-24T10:29:20.293 回答