ORMLite处理uniqueCombo约束失败异常

时间:2013-01-31 15:48:10

标签: android sql sqlite exception ormlite

我的数据库中有几列已注释为uniqueCombo = true

@DatabaseField(columnName = "COL1", uniqueCombo = true)
private Double col1;

@DatabaseField(columnName = "COL2", uniqueCombo = true)
private Double col2;

根据ormlite文档,这两个字段的组合在表格中应该是唯一的。为了测试这个,我故意添加相同的字段。我确实得到了SQLException但不知道如何处理这个异常并要求用户进行更改。

try {
        mydao.create(myInfo);

     } catch (SQLException e) {
        // TODO Auto-generated catch block

       e.printStackTrace();
       /* Need to uniquely identify constraint failed error here
        * and ask user to make suitable change */
     }

知道如何实现这一目标。

- 更新---

SQLException getErrorCode和getSQLState分别返回0和null。

Logcat StackTrace:

Caused by: android.database.sqlite.SQLiteConstraintException: column NAME is not unique (code 19)
01-31 22:15:14.042: W/System.err(2586):         at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
01-31 22:15:14.042: W/System.err(2586):         at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
01-31 22:15:14.042: W/System.err(2586):         at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
01-31 22:15:14.042: W/System.err(2586):         at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
01-31 22:15:14.042: W/System.err(2586):         at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:122)
01-31 22:15:14.042: W/System.err(2586):         ... 15 more

2 个答案:

答案 0 :(得分:1)

  

我确实得到了SQLException,但我不确定如何处理此异常并要求用户进行更改。

您当然可以捕获异常并查看它是否为instanceof SQLiteConstraintException,但我总是讨厌将异常视为常见事件。

我要做的是对用户的输入进行查询,以查看是否存在具有相同字段的现有MyInfo对象。如下所示:

QueryBuilder<MyInfo, Integer> qb = mydao.queryBuilder();
qb.where().eq("COL1", myInfo.col1).and().eq("COL2", myInfo.col2);
if (qb.queryForFirst() != null) {
   // tell the user to enter unique values
}

答案 1 :(得分:0)

这不是最好的方法,但这对某些人有帮助......

try {
        //insert to ORMLite
} catch (SQLException e) {
        validateException(e);
}
validateException方法中的

private void validateException(SQLException e) {
        try{
            if (e.getCause() == null)
                throw e;
            if (e.getCause().getCause() == null)
                throw e;
            if (e.getCause().getCause() instanceof SQLiteConstraintException)
                Log.d("Test", "Ignoring duplicate");
            else
                throw e;
        }catch(SQLException e1){
            //exception thrown by e;
        }
    }