使用rawQuery()方法更新表不起作用

时间:2012-10-24 10:25:32

标签: android sqlite

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

为什么这不起作用?

5 个答案:

答案 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,否则不要!

Increase the value of a record in android/sqlite database

答案 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)   组。

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

Documentation for execSQL:

public void execSQL (String sql)

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

Documentation for rawQuery:

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

运行提供的SQL并在结果集上返回游标。