我在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错误,到目前为止这是正确的。 一切都按预期工作。 但我无法使捕获代码有效。
答案 0 :(得分:24)
尝试使用insertOrThrow。否则,插入只在发生错误时返回-1。
答案 1 :(得分: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 ;
}
这里的数据库将尝试添加值,如果传递的值没有冲突或错误,布尔值将保持为真如果错误布尔值将为false并将返回它并且您可以将任何消息干燥为ex toast(存在冲突) )
答案 2 :(得分:0)
很抱歉,但上面提到的答案在android 4.4.2上对我不起作用。 min sdk等级11,最高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