我的应用程序使用了一些复杂的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,如何捕获更新中止/失败?
答案 0 :(得分:1)
我只是试图在Android API级别19的Java源代码部分找到该行为的解释,但SQLiteAbortException
被重新抛出的唯一位置是名为{{的静态帮助器类。 1}}。它最初是使用android_database_SQLiteCommon.cpp
中的方法从本机代码抛出的。当SQLite返回错误代码4(名为DatabaseUtils
和documented 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
文档并不完全正确。