2012-09-12 47 views
0

所以我有一个数据库,SQLiteDatabase db我写在我的经理类一对夫妇的私有方法,将通过一个公共方法被调用:删除VS execSQL命令机器人

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);  
     } 
    } 

我的问题是这样的..我想以便能够将sql异常返回到公共方法,以便在出现异常时终止事务并回滚所有数据。

看起来使用delete()和insert()方法比清除execSQL()但不抛出sqlExceptions。另一方面execSQL()呢?我是否需要使用execSQL,以及如何确保它应引发任何私有方法中的异常,以便将其捕获并将其回滚到私有方法中

回答

0

首先execSQL()如果sql中引发异常字符串无效。那是在sql字符串语法不是sql操作的例外。也就是说,如果sql语句有效但操作失败(例如由于约束),它不会引发异常。

所以..

基本上execSQL()delete()之间的唯一区别是,受影响的行delete()收益数(在你的情况下,删除的行数),但execSQL()没有。

注:
delete()返回受影响的行数,你必须通过比在where子句参数null以外的任何值。在你的情况下,通过"1"