удалить команды execSQL для Android

Итак, у меня есть база данных, 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(), но не генерирует исключений sqlException. execSQL(), с другой стороны, делает? мне нужно использовать execSQL и как я могу гарантировать, что если он выдаст исключение в любом из частных методов, он поймает его и откатит его в частном методе


person erik    schedule 12.09.2012    source источник


Ответы (1)


прежде всего execSQL() выдает исключение, если строка sql недействительна. то есть исключение находится в синтаксисе строки sql, а не в операции sql. то есть он не выдаст исключение, если оператор sql действителен, но операция не удалась (например, из-за ограничения).

So ..

в основном единственная разница между execSQL() и delete() заключается в том, что delete() возвращает количество затронутых строк (в вашем случае количество удаленных строк), а execSQL() нет.

Примечание:
чтобы delete() возвращало количество затронутых строк, необходимо передать любое значение, кроме null, в параметр предложения where. В вашем случае передайте "1".

person kdehairy    schedule 26.09.2012