使用原始查询从Android中的SQLite获取更新的行数?

时间:2011-07-12 05:00:05

标签: android sqlite

如何在Android中的SQLite中使用update语句更新行数?

请注意,我需要使用某种类型的SQL语句的原始执行,而不是对ContentValues执行任何操作,因为我需要动态查询。因此,我无法使用SQLiteDatabase.update()方法。例如,我正在运行类似

的东西
UPDATE my_table 
   SET field_name = field_name + 1

我知道的返回void的方法,例如SQLiteDatabase.execSQL()SQLiteDatabase.rawQuery()返回Cursor,但游标的行数为零,其计数始终为-1。

4 个答案:

答案 0 :(得分:16)

您可以根据需要进行插入,然后执行选择并使用changes()函数返回受影响的行数。

答案 1 :(得分:11)

要展开Mat's answer,以下是获取更新行数的示例代码:

Cursor cursor = null;
try
{
    cursor = db.rawQuery("SELECT changes() AS affected_row_count", null);
    if(cursor != null && cursor.getCount() > 0 && cursor.moveToFirst())
    {
        final long affectedRowCount = cursor.getLong(cursor.getColumnIndex("affected_row_count"));
        Log.d("LOG", "affectedRowCount = " + affectedRowCount);
    }
    else
    {
        // Some error occurred?
    }
}
catch(SQLException e)
{
    // Handle exception here.
}
finally
{
    if(cursor != null)
    {
        cursor.close();
    }
}

答案 2 :(得分:4)

扩展Mat和Pang的答案......

我们可以跳过光标并使用 simpleQueryForLong() 吗?

e.g。

public long getChangesCount() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteStatement statement = db.compileStatement("SELECT changes()");
    return statement.simpleQueryForLong();
}

答案 3 :(得分:1)

您可以使用SQLiteStatement.executeUpdateDelete方法:

SQLiteDatabase db = getReadableDatabase();
SQLiteStatement statement = db.compileStatement("[your sql here]");
int affectedRows = statement.executeUpdateDelete();

SQLiteDatabase.update(...)方法内部使用的相同方法。