Android, обработчик SQLiteConstraintException

У меня есть этот метод в Android:

public void insertarTitulo(String _id, String title, String url){
    ContentValues cv = new ContentValues();

    cv.put("_id", _id);
    cv.put("title", title);
    cv.put("URL", url);

try{
        getWritableDatabase().insert("book", "book", cv);
}catch(SQLiteConstraintException e){

       Log.e(MyActivity.LOGTAG,   "This code doesn't show");


}
    close();

}

title значение уникально, поэтому, когда я вставляю дублирующее значение, я вызываю ошибку Constraint, пока это правильно. Все работает так, как ожидалось. но я не могу заставить код catch работать.

Ответ 1

Попробуйте использовать insertOrThrow. В противном случае вставка только возвращает -1 в случае ошибки.

Ответ 2

При выполнении для добавления значений в базе данных из класса ввода добавьте boolean для управления данными например:

   boolean DBAccepted = DBhelper.addData(blabla);

if(DBAccepted ==false)
{
Toast.maketext (this,"There is a conflict",Toast.LengthLong ).show();
}

в классе DBhelper:

public boolean addData(String blablabla){
    DBAccepted =true;
ContentValues cv = new ContentValues();
    cv.put(key_value, blablabla);
     Databes.insertOrThrow(TABLE_SCORES, null, cv);
    } catch (SQLiteConstraintException e) {
                // TODO Auto-generated catch block
                    System.out.println(e);
                    DBAccepted =false;
            }
        return DBAccepted ;
    }

В базе данных мы попытаемся добавить значения, если значения, переданные без конфликта или ошибки, будут иметь значение boolean, если ошибка будет логической, будет ложной и вернет ее, и вы можете подтолкнуть любое сообщение как ex toast (есть конфликт )

Ответ 3

Извините, но ответы, упомянутые выше, не работают для меня на android 4.4.2. min sdk level 11, max 21.

Что сработало для меня, было следующее:

/*FIRST INSERT A VALUE*/
database = //get a writable database instance
String MESSAGES_TABLE = "messages";
ContentValues cv= new ContentValues();
cv.put("unique_id_column","unique_id");
database.insert(MESSAGES_TABLE,null,cv);
database.close();



/*NOW LETS TRY TO INSERT ANOTHER RECORD, WITH THE SAME VALUE, WHERE UNIQUE_ID_COLUMN
IS THE UNIQUE COLUMN DEFINED WHILE CREATING THE TABLE.*/
database == //get a writable database instance
try{            
    long new_row_id = database.insertWithOnConflict(MESSAGES_TABLE, null,cv,SQLiteDatabase.CONFLICT_FAIL);
    Log.d(SS_DATABASE_TAG,"the new row id is ---> " + String.valueOf(new_row_id));          
    }
catch(SQLiteConstraintException e)
    {
    Log.d(SS_DATABASE_TAG,"caught the contraint.");
    }
database.close();

это правильно улавливает ограничение, и вы можете выполнять свою обработку внутри блока catch.

RR.