10

How can I get the number of rows updated using an update statement in SQLite in Android?

Note that I need to use some type of raw execute of a SQL statement, rather than do anything with ContentValues because I need a dynamic query. Thus I can't make use of the SQLiteDatabase.update() method. For example, I'm running something like

UPDATE my_table 
   SET field_name = field_name + 1

The methods I know of return void, e.g. SQLiteDatabase.execSQL(). SQLiteDatabase.rawQuery() returns a Cursor, but the cursor has zero rows and its count is always -1.

OMG Ponies
  • 325,700
  • 82
  • 523
  • 502
Tyler Collier
  • 11,489
  • 9
  • 73
  • 80

4 Answers4

17

You could do your insert whichever way you want, and then do a select and use the changes() function to return the number of affected rows.

Mat
  • 202,337
  • 40
  • 393
  • 406
12

To expand on Mat's answer, here's the example code for getting the updated row count:

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();
    }
}
Community
  • 1
  • 1
Pang
  • 9,564
  • 146
  • 81
  • 122
5

Expanding on Mat and Pang's answers...

Could we skip the Cursor and use simpleQueryForLong()?

e.g.

public long getChangesCount() {
    SQLiteDatabase db = getReadableDatabase();
    SQLiteStatement statement = db.compileStatement("SELECT changes()");
    return statement.simpleQueryForLong();
}
serv-inc
  • 35,772
  • 9
  • 166
  • 188
Baker
  • 24,730
  • 11
  • 100
  • 106
3

You can use SQLiteStatement.executeUpdateDelete method for this:

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

The same method used internally in SQLiteDatabase.update(...) methods.

Fedir Tsapana
  • 1,283
  • 16
  • 19