如何在 SQLiteConstraintException 上捕获列名唯一约束失败

Posted

技术标签:

【中文标题】如何在 SQLiteConstraintException 上捕获列名唯一约束失败【英文标题】:How to catch column name on SQLiteConstraintException Unique Constraint failed 【发布时间】:2019-03-18 03:53:08 【问题描述】:

我正在测试我的应用程序并尝试在 SQLite 中插入重复记录。 Java 返回了一个异常,其中包含完全相同的列。我可以提取错误信息以向用户显示一条消息,其中包含他输入的重复信息吗?

我的代码:

        ContentValues valores;
    valores = new ContentValues();
    valores.put("nome", nome);
    valores.put("apelido", apelido);

    try 
        resultado = db.insert("escolas", null, valores);
    catch (SQLiteConstraintException e)
        Log.e("dop",e.getLocalizedMessage()+"");
        Log.e("dop",e.getMessage()+"");
        Log.e("dop",e.getCause()+"");
        Log.e("dop",e.getStackTrace()+"");
        Log.e("dop",e.getSuppressed()+"");
    

logcat 中的异常

10-12 18:59:49.747 24576-24576/br.com.brhuearts.escola1 E/SQLiteDatabase: Error inserting nome=A apelido=B
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: escolas.nome (code 2067)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
    at br.com.brhuearts.escola1.presenter.PresenterEscola.insertEscola(PresenterEscola.java:51)

【问题讨论】:

【参考方案1】:

如果您使用替代的便捷方法insertOrThrow.

根据:-

    resultado = db.insertOrThrow("escolas", null, valores);

或者,您可以检查 insert 返回的 long 是否为 1 或更大(应为 -1 表示未插入行,绝不应为 0) .但是,重复不一定是未插入行的唯一原因。

【讨论】:

或者您可以检查以确保插入将首先工作。

以上是关于如何在 SQLiteConstraintException 上捕获列名唯一约束失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?