0

所以我有一个数据库,SQLiteDatabase db我在我的管理器类中编写了几个私有方法,这些方法将被公共方法调用:

    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 以及如何确保它应该在任何私有方法中抛出异常,它将捕获它并在私有方法中回滚

4

1 回答 1

0

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

所以 ..

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

注意:
delete()返回受影响的行数,您必须传递除nullwhere 子句参数之外的任何值。在你的情况下,通过"1".

于 2012-09-26T14:30:37.357 回答