Android Sqlite SQLiteAbortException不起作用
我的应用程序使用了一些复杂的sql语句,因此我养成了经常使用execsql的坏习惯,即使我可以/应该使用insert或update之类的简单语句(见下文) 然而,我想知道为什么这不起作用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
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
的错误代码与SQLABORT
子句几乎没有关系。事实上,我非常怀疑这个异常是否会被抛出,因为我不认为Android的SQLite数据库驱动程序的本机部分会将回调挂接到中止请求的SQLite中
还具体说明了预期的错误代码类型:
中止
当发生适用的约束冲突时,中止
解析算法中止
带有SQLITE\u约束的当前SQL语句错误(…snip)
因此,根据SQLite的文档和本地Android源代码的实际功能,在这种情况下,SQLiteConstraintException
是可以预期的,显然Android的SQLiteAbortException
文档并不完全正确。,中止
仅是在违反约束的情况下的解决方案。如果数据不需要更新,那么也没有需要中止的冲突。是否可以尝试违反约束的update语句(例如使用另一个已存在的主键值更新主键值)?@Nobu SQliteAbortException无法按预期工作。因此,我尝试使用插入而不是更新,因为我知道由于非唯一密钥,我会遇到冲突。没有效果。但是,更改为SQLiteConstraintException确实会引发错误。在这两种情况下使用更新都不会引发错误,尽管您不会期望出现违反约束的错误。感谢您深入了解所有这些!我将在re SQLiteAbortException中放置一个报告并链接此线程。显然,我也有一个误解(或过高的期望),即更新失败也会导致SQLite分支到fail或abort子句中。情况似乎并非如此,我想查看更新是否失败的唯一方法是检查更改的行数。