2012-09-12 1 views
0

j'ai donc une base de données, SQLiteDatabase db je suis en train d'écrire un couple des méthodes privées dans ma classe de gestionnaire qui sera appelé par une méthode publique:supprimer vs execSQL commandes android

public void updateData (MakeabilityModel newData){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     db.beginTransaction(); 
     try { 

      reWriteSVTable(db, list); 

      db.setTransactionSuccessful(); 
     } catch (Exception e){ 
      //TODO through rollback message? 
      e.printStackTrace(); 
     } finally { 

      db.endTransaction(); 
     } 

    } 
    //Private Methods 
    private void clearTable(SQLiteDatabase db, String table){ 
     db.delete(table, null, null); 

    } 


    private void reWriteSVTable(SQLiteDatabase db, List<MakeabilityLens> lenses){ 
     clearTable(db, singleVision); 
     ContentValues cv; 
     for(int i=0; i<lenses.size(); i++){ 
      cv = new ContentValues(); 
      cv.put(colScreenID, hsID); 
      cv.put(colIconID, id); 
      cv.put(colRank, hsTotal); 
      db.insert(isLookUp, colID, cv);  
     } 
    } 

Ma question est .. je veux pour être en mesure de jeter des exceptions sql retour à la méthode publique de sorte que s'il y a une exception, il va tuer la transaction et annuler toutes les données ..

il semble que l'utilisation des méthodes delete() et insert() sont plus propres que execSQL() mais ne lance pas sqlExceptions. execSQL() d'autre part fait? ai-je besoin d'utiliser execSQL et comment puis-je m'assurer que s'il lance une exception dans l'une des méthodes privées qu'il l'attrape et l'annule dans la méthode privée

Répondre

0

d'abord execSQL() déclenche une exception si le sql chaîne n'est pas valide. c'est l'exception est sur la syntaxe de chaîne sql pas l'opération sql. c'est-à-dire qu'il ne lèvera pas d'exception si l'instruction sql est valide mais que l'opération a échoué (à cause d'une contrainte par exemple).

So ..

essentiellement la seule différence entre execSQL() et delete() est que delete() renvoie le nombre de lignes affectées (dans votre cas, le nombre de lignes supprimées), mais execSQL() ne fonctionne pas.

Note:
pour delete() pour retourner le nombre de lignes affectées, vous devez passer une valeur autre que null dans le paramètre où la clause. Dans votre cas, transmettez le "1".