【问题标题】:Strange SQLite behavior. Different results; same query [closed]奇怪的 SQLite 行为。不同的结果;相同的查询[关闭]
【发布时间】:2014-10-08 16:25:52
【问题描述】:

我有一个类似的查询:

SELECT id,name,province,enabled 
FROM customers 
WHERE enabled = 1 AND (name LIKE "%to%" OR  province LIKE "%to%");

在 MAC 或 IPAD 上使用相同的数据库会给我不同的结果。

在 Mac 上它按预期工作并返回 11 条记录,但在 iPad 上返回 55 条记录¿? (奇怪的是,其中一些启用了字段 = 0)真的很奇怪。

iPad 应用是用 Xcode6 在 Objective C 中完成的

我认为 sqlite3 在两个设备上的版本并不完全相同,并且不会以相同的方式解释括号优先级。

【问题讨论】:

  • 我强烈怀疑您的代码在两个版本之间存在实际差异。
  • 你所描述的是不可能的。请显示执行查询的代码。
  • SQLite 从一个平台到另一个平台都非常稳定和可预测——远远优于 iOS、Windows 等。发现行为上的实际差异是非常不寻常的。

标签: ios objective-c sqlite


【解决方案1】:

我怀疑 iOS 版本在 SQL 中存在问题,可能缺少括号。例如,以下 SQL 可能包含 enabled 不等于 1 的结果:

SELECT id,name,province,enabled 
FROM customers 
WHERE enabled = 1 AND name LIKE "%to%" OR  province LIKE "%to%";

确保包括原始问题中所示的括号。

【讨论】:

  • 我知道。 SQL 有括号,事实上,我测试了它从 XCode 日志中复制传递查询。这就是为什么如此奇怪,相同的查询在不同的设备上使用相同的数据库得到不同的结果。
  • @MiQUEL 是的,我听到了。但我认为一定有一些微妙的差异在逃避你的分析。但是没有代码示例,我们无法帮助您。如果没有可重现的问题示例,我们将无法为您提供帮助。尝试创建最小的MCVE 来重现问题。但我敢打赌,iOS SQLite 引擎中括号的优先级几乎肯定不是的问题。虽然我确信你觉得你已经控制了所有其他可能的变量,但这里肯定有其他东西在起作用。
【解决方案2】:

找到了。

故事,当应用程序加载时,它会清空数据库,并从它下载的 xml 中填充所有数据。

之后,它会使用这样的更新语句更新一些记录,例如“启用”字段。

update customers set enabled = 1 where date(some_date_field)>date('1980-12-01');

这就是问题所在:

update customers set enabled = 1 where some_date_field>date('1980-12-01');

stackoverflow similar problem solution

因此,在这种情况下,认为相同但实际上不相等的两个数据库是正确的,这就是我看到不同结果的原因。

并且无法从 ipad 获取数据库(不再越狱)让我感到困惑,这和 Documents Directory 每次在模拟器中运行应用程序时都会发生变化,这也没有真正的帮助:(

感谢大家的关注。

【讨论】:

  • 很高兴你找到它!仅供参考,您仍然可以通过 Xcode 从设备下载文档文件夹:在 Xcode“窗口”菜单中,选择“设备”;然后选择您的设备并选择您的应用程序;然后单击“齿轮”图标,您可以将“容器”下载到您的 Mac。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多