Android Sqlite SQLiteAbortException不起作用

时间:2014-02-18 00:23:23

标签: android sqlite

我的应用程序使用了一些复杂的sql语句,所以我经常习惯使用execsql,即使我可能/应该使用插入或更新等简单的东西(下面)。

但是,我想知道为什么这不起作用

String query = "UPDATE OR ABORT " + myTable + " SET " + .... column names and values + WHERE ...
try {
    db.execSQL(query);
} catch (SQLiteAbortException e) {
    Log.i(TAG, "error in the update");

我已尝试使用明显失败的数据(即,没有匹配的记录要更新),但我没有遇到问题。最初我使用了UPDATE或FAIL和一个SQLiteConstraintException但是当没有捕获时我尝试了SQLiteAbortException,具体说明了

  

表示SQLite程序已中止的异常。这个   可以通过在触发器中调用ABORT,或者作为   使用ABORT冲突条款的结果。

我在这里缺少什么?

更新:只需添加this以供INSERT / UPDATE或ABORT / FAIL参考如果不是SQLiteAbortException,如何捕获更新中止/失败?

1 个答案:

答案 0 :(得分:1)

我只是试图在Android API级别19的Java源代码部分找到该行为的解释,但SQLiteAbortException被重新抛出的唯一位置是名为{{的静态帮助器类。 1}}。它最初是使用android_database_SQLiteCommon.cpp中的方法从本机代码抛出的。当SQLite返回错误代码4(名为DatabaseUtilsdocumented as时)抛出它:

  

/ *回调例程请求中止* /

我强烈假设有一个C回调函数。您可以使用SQLite注册回调,它们似乎有一定程度的控制。因此,在我看来,转换为SQLITE_ABORT的错误代码与SQL SQLiteAbortException子句几乎没有关系。事实上,我非常怀疑这个异常会被抛出,因为我不认为Android的SQLite数据库驱动程序的本机部分会将回调挂钩到SQLite中止请求。

SQLite documentation of ABORT也具体到哪种错误代码:

  

<强> ABORT

     

当发生适用的约束违规时,ABORT解析算法将中止   当前带有 ABORT错误的SQL语句(... snip)

因此,根据SQLite的文档以及本机Android源代码实际执行的操作,在这种情况下需要SQLITE_CONSTRAINT,显然Android的SQLiteConstraintException文档并不完全正确。