Android,处理SQLiteConstraintException

时间:2011-11-07 17:46:00

标签: android sqlite exception handle constraints

我在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错误,到目前为止这是正确的。 一切都按预期工作。 但我无法使捕获代码有效。

3 个答案:

答案 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