SQLite Changes()函数报告在某些DELETE语句中更改了0行

SQLite changes() function reports 0 rows changed in certain delete statements(SQLite Changes()函数报告在某些DELETE语句中更改了0行)
本文介绍了SQLite Changes()函数报告在某些DELETE语句中更改了0行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近发现CHANGES()函数在SQLite中可用。我在我的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起已修复。

这篇关于SQLite Changes()函数报告在某些DELETE语句中更改了0行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Using Firebase Firestore in offline only mode(在仅脱机模式下使用Firebase FiRestore)
Crash on Google Play Pre-Launch Report: java.lang.NoSuchMethodError(Google Play发布前崩溃报告:java.lang.NoSuchMethodError)