2013-01-31 53 views
3

我有我的數據庫一對夫婦的列已被註釋爲uniqueCombo =真ORMLite處理uniqueCombo約束失敗例外

@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 */ 
    } 

任何想法如何實現。

- UPDATE ---

的SQLException getErrorCode用於和getSQLState都分別返回0和空。

logcat的堆棧跟蹤:

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 
+0

異常的確切內容是什麼,在logcat中看到的是什麼 –

+0

@StefandeBruijn:它並不重要,它違反約束條件是SQLiteException。 – PravinCG

回答

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 
} 
+0

這正是我所做的,但你不認爲使用多個數據庫操作會影響性能,除了例外本身是爲了處理這種情況,不是嗎?我會盡量使用你的第一個建議。 – PravinCG

+1

例外IMO適用於「特殊」條件@PravinCG。人們使用例外確實意味着我不喜歡的響應代碼。如果這是驗證用戶輸入的輸入,那麼額外的數據庫操作根本不應該影響系統。 – Gray

+0

有趣的是,感謝您的信息。然而,在ORMlite的更廣泛的範圍內,我們如何跟蹤代碼中的異常,因爲所有異常都被封裝並拋出爲SQLException,這使得很難區分另一個異常。 – PravinCG

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; 
     } 
    }