Android Sqlite SQLiteAbortException不起作用

Android Sqlite SQLiteAbortException不起作用,android,sqlite,Android,Sqlite,我的应用程序使用了一些复杂的sql语句,因此我养成了经常使用execsql的坏习惯,即使我可以/应该使用insert或update之类的简单语句(见下文) 然而,我想知道为什么这不起作用 String query = "UPDATE OR ABORT " + myTable + " SET " + .... column names and values + WHERE ... try { db.execSQL(query); } catch (SQLiteAbortException

我的应用程序使用了一些复杂的sql语句,因此我养成了经常使用execsql的坏习惯,即使我可以/应该使用insert或update之类的简单语句(见下文)

然而,我想知道为什么这不起作用

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程序已中止的异常。这 可以通过在触发器中调用中止来发生,也可以作为 使用中止冲突子句的结果

我错过了什么


更新:只是在插入/更新或中止/失败时添加以供参考如果SQLiteAbortException不是方法,如何捕获更新中止/失败

我只是试图在Android API level 19的Java源代码部分中找到对该行为的解释,但唯一(重新)抛出
SQLiteAbortException
的地方是名为
DatabaseUtils
的静态帮助器类。它最初是使用中的方法从本机代码中抛出的。当SQLite返回名为
SQLite\u ABORT
的错误代码4时,会引发该错误:

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

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

还具体说明了预期的错误代码类型:

中止

当发生适用的约束冲突时,
中止
解析算法中止 带有
SQLITE\u约束的当前SQL语句
错误(…snip)


因此,根据SQLite的文档和本地Android源代码的实际功能,在这种情况下,
SQLiteConstraintException
是可以预期的,显然Android的
SQLiteAbortException
文档并不完全正确。

中止
仅是在违反约束的情况下的解决方案。如果数据不需要更新,那么也没有需要中止的冲突。是否可以尝试违反约束的update语句(例如使用另一个已存在的主键值更新主键值)?@Nobu SQliteAbortException无法按预期工作。因此,我尝试使用插入而不是更新,因为我知道由于非唯一密钥,我会遇到冲突。没有效果。但是,更改为SQLiteConstraintException确实会引发错误。在这两种情况下使用更新都不会引发错误,尽管您不会期望出现违反约束的错误。感谢您深入了解所有这些!我将在re SQLiteAbortException中放置一个报告并链接此线程。显然,我也有一个误解(或过高的期望),即更新失败也会导致SQLite分支到fail或abort子句中。情况似乎并非如此,我想查看更新是否失败的唯一方法是检查更改的行数。