我最近发现 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)
问题:
- 谁能证实这一行为?这是可以预料的吗?
- SQLite 是否会截断此处的表?
- 除了计算
DELETE
之前的行数之外,还有什么方法可以解决这个问题吗?
最佳答案
我认为这很可能是由于所谓的截断优化(我说最有可能是因为我不确定您使用的是哪个版本的 SQLite)。当没有 WHERE
子句时,SQLite 使用优化来删除整个表内容,而无需单独访问表的每一行。请参阅reference docs for DELETE .
请注意,此行为自 3.6.5 起已修复。
关于android - SQLite Changes() 函数报告在某些删除语句中更改了 0 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843255/