2011-07-12 9 views
8

¿Cómo puedo obtener el número de filas actualizadas usando una declaración update en SQLite en Android?Obtenga conteo de filas actualizado de SQLite en Android usando una consulta sin procesar?

Tenga en cuenta que necesito usar algún tipo de ejecución sin formato de una instrucción SQL, en lugar de hacer cualquier cosa con ContentValues porque necesito una consulta dinámica. Por lo tanto, no puedo hacer uso del método SQLiteDatabase.update(). Por ejemplo, yo estoy quedando algo así como

UPDATE my_table 
    SET field_name = field_name + 1 

Los métodos que conozco de retorno void, por ejemplo, SQLiteDatabase.execSQL(). SQLiteDatabase.rawQuery() devuelve Cursor, pero el cursor tiene cero filas y su recuento es siempre -1.

Respuesta

15

Se podría hacer su inserción de cualquier manera que desee, y luego hacer una selecta y utilizar la función changes() para devolver el número de filas afectadas.

+0

¿Está ese método disponible en las API de Android? –

+0

Es una función sqlite. Lo usas en consultas 'select', independientemente del idioma que estés usando. – Mat

+1

Ah. ¡Estupendo! Me imagino que es sensato ajustar esas llamadas a las transacciones. Entonces harías 1) comenzar tran 2) actualizar 3) obtener cambios 4) finalizar transacción. Funciona, gracias! –

10

Para ampliar Mat's answer, aquí está el código de ejemplo para obtener el número de filas actualización:

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(); 
    } 
} 
+3

Usaría este enfoque más simple: 'cursor.getLong (0)'. –

4

Ampliando Mat y respuestas de Pang ...

Podríamos saltar el cursor y utilizar simpleQueryForLong() ?

p. Ej.

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

Puede utilizar el método SQLiteStatement.executeUpdateDelete para esto:

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

El mismo método utilizado internamente en SQLiteDatabase.update (...) métodos.

Cuestiones relacionadas