Ответ 1
Попробуйте использовать insertOrThrow. В противном случае вставка только возвращает -1 в случае ошибки.
У меня есть этот метод в 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 работать.
Попробуйте использовать insertOrThrow. В противном случае вставка только возвращает -1 в случае ошибки.
При выполнении для добавления значений в базе данных из класса ввода добавьте 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 (есть конфликт )
Извините, но ответы, упомянутые выше, не работают для меня на 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.