android - SQLite Changes() 函数报告在某些删除语句中更改了 0 行

标签 android sqlite sql-delete pragma

我最近发现 SQLite 中提供了 CHANGES() 函数。我正在 Android 代码中执行以下操作:

db.execSQL(sqlStatement, argumentArray);
int result;
SQLiteStatement stmt = db.compileStatement("SELECT CHANGES()");
try {
    return stmt.simpleQueryForLong();
} finally {
    stmt.close();
}

我所看到的是,我获得了所有语句的良好数据,例如:

UPDATE `footable` SET `stuff` = 'fepojefpjo'   (returns 1 row updated)
DROP TABLE `footable`                          (returns 2 rows dropped)
DELETE FROM `footable` WHERE `id` IN (?,?)     (returns 2 rows deleted)

但是当我发出以下语句时,我总是会更改 0 行 - 即使肯定有行被删除:

DELETE FROM `footable`                         (always returns 0)

由于我要删除表中的所有内容,我想知道 SQLite 是否在幕后执行某种截断操作。如果我只是在语句末尾添加一个垃圾 WHERE 1 ,它会返回正确的行数。

DELETE FROM `footable` WHERE 1                 (works)

问题:

  1. 谁能证实这一行为?这是可以预料的吗?
  2. SQLite 是否会截断此处的表?
  3. 除了计算DELETE之前的行数之外,还有什么方法可以解决这个问题吗?

最佳答案

我认为这很可能是由于所谓的截断优化(我说最有可能是因为我不确定您使用的是哪个版本的 SQLite)。当没有 WHERE 子句时,SQLite 使用优化来删除整个表内容,而无需单独访问表的每一行。请参阅reference docs for DELETE .

请注意,此行为自 3.6.5 起已修复。

关于android - SQLite Changes() 函数报告在某些删除语句中更改了 0 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843255/

相关文章:

android - 如何使用android_asset

android - 最初在列表中不可见时未选中 MultiSelectListPreference 复选框(API 23)

sql - 如何在JOIN查询中匹配多个条件

sqlite - 导入前如何验证数据库中不存在记录?

php - 我的 mysql delete 语句有什么问题?

c# - 如何删除具有相同相册 ID 的所有图像文件?

用于渐进式 Web 应用程序的 Android 状态栏图标

java - 如何以编程方式在中心裁剪特定尺寸的位图

android - Android 中使用多个数据库表时的代码设计

mysql - SQL 在具有限制的选择查询后删除行