2011-07-12 2 views
8

Comment puis-je obtenir le nombre de lignes mises à jour à l'aide d'une instruction update dans SQLite dans Android?Obtenez les lignes mises à jour compte de SQLite dans Android en utilisant une requête brute?

Notez que j'ai besoin d'utiliser un type d'exécution brute d'une instruction SQL, plutôt que de faire quoi que ce soit avec ContentValues car j'ai besoin d'une requête dynamique. Donc je ne peux pas utiliser la méthode SQLiteDatabase.update(). Par exemple, je suis en quelque chose comme

UPDATE my_table 
    SET field_name = field_name + 1 

Les méthodes que je connais du vide de retour, par exemple SQLiteDatabase.execSQL(). SQLiteDatabase.rawQuery() renvoie Cursor, mais le curseur a zéro ligne et son nombre est toujours -1.

Répondre

15

Vous pouvez faire votre insertion comme vous le souhaitez, puis sélectionnez et utilisez la fonction changes() pour renvoyer le nombre de lignes affectées.

+0

Cette méthode est-elle disponible dans les API Android? –

+0

C'est une fonction sqlite. Vous l'utilisez dans les requêtes 'select' - indépendamment de la langue que vous utilisez. – Mat

+1

Ah. Génial! J'imagine qu'il est sage d'envelopper ces appels avec des transactions. Donc vous feriez 1) commencer tran 2) faire la mise à jour 3) obtenir des modifications 4) fin de la transaction. Cela fonctionne, merci! –

10

développiez Mat's answer, voici l'exemple de code pour obtenir le nombre de lignes mises à jour:

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

J'utiliserais cette approche plus simple: 'cursor.getLong (0)'. –

4

Développant Mat et les réponses de Pang ...

Pouvons-nous passer le curseur et utiliser simpleQueryForLong() ?

par exemple.

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

Vous pouvez utiliser la méthode SQLiteStatement.executeUpdateDelete pour cela:

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

La même méthode utilisée en interne dans les méthodes SQLiteDatabase.update (...).

Questions connexes