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()

注:
forが影響を受ける行数を返すには、where 句パラメーターdelete()以外の値を渡す必要があります。nullあなたの場合、 を渡し"1"ます。

于 2012-09-26T14:30:37.357 に答える