3

データベースに uniqueCombo=true と注釈が付けられた列がいくつかあります

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

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

ormlite のドキュメントによると、これら 2 つのフィールドの組み合わせはテーブル内で一意である必要があります。これをテストするために、意図的に同じフィールドを追加しています。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 スタック トレース:

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
4

2 に答える 2

1

I do get the SQLException but am not sure how do I handle this exception and ask the user to make changes.

You can certainly catch the exception and see if it is instanceof SQLiteConstraintException but I always hate treating exceptions as common occurrences.

What I would do is do a query on the user's input to see if there is an existing MyInfo object with the same fields. Something like the following:

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
}
于 2013-02-01T14:22:44.330 に答える
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;
        }
    }
于 2015-03-17T21:12:20.213 に答える