是否可以有 [FMResultSet previous] 和/或 [FMResultSet goRecord:1]?
Posted
技术标签:
【中文标题】是否可以有 [FMResultSet previous] 和/或 [FMResultSet goRecord:1]?【英文标题】:Is possible to have [FMResultSet previous] and/or [FMResultSet goRecord:1]? 【发布时间】:2013-05-06 19:59:34 【问题描述】:为了使用 sqlite 填充 UITableViews,我将所有数据复制到 NSArrays/Dicts,以便我可以在列表中返回/前进。但是,这样做很浪费,并且需要两次获取数据。
我想知道是否有可能拥有[FMResultSet previous]
和/或[FMResultSet goRecord:RECNO]
,这样我就可以摆脱副本并直接使用 FMResultSet。
那么 sqlite API 提供了这种可能性?
【问题讨论】:
【参考方案1】:有一个很好的article,SQLite 的创建者 Richard Hipp 写了为什么 SQLite 没有后退功能,以及为什么这是一个非常困难的问题。本文还提供了一些您可能会感兴趣的解决方法。
引用那篇文章,
上面的 sqlite3_step() 函数似乎在结果集中向前推进了一个游标。然后很自然地会问为什么没有相应的 sqlite3_step_backwards() 函数来向后移动结果集。毕竟,似乎 sqlite3_step_backwards() 应该很容易实现。只需在结果集中后退一步,而不是前进...
但这一点都不容易。事实上,SQLite 的设计者一直想不出一种算法可以在一般情况下完成这项工作。对于某些特殊情况,例如上面的简单示例查询,在结果集中向后退一步很容易。但是事情变得更复杂了,例如,如果查询真的是 4 路 LEFT OUTER JOIN,在结果列和 WHERE 子句中都有子查询。
问题在于 sqlite3_step() 函数根本不逐步执行预先计算的结果集。考虑问题的更好和更现实的方法是假设每个准备好的语句实际上是一个计算机程序。您正在调试器中运行该程序,并且在计算内部深处的某个语句上设置了一个断点。调用 sqlite3_step() 函数就像在调试器中按下“运行”按钮,从而要求调试器运行程序,直到它退出或遇到断点。 Sqlite3_step() 如果遇到断点则返回 SQLITE_ROW,如果完成则返回 SQLITE_DONE。如果命中断点,则可以查看局部变量以查找“行”的值。然后您可以再次按下“运行”按钮(调用 sqlite3_step())继续执行,直到下一个断点或程序退出。
从这个角度来看(这更接近 SQLite 在内部的工作方式)请求 sqlite3_step_backward() 按钮真的就像期望您的符号调试器能够向后运行或“撤消”其执行回到上一个断点。没有人合理地期望调试器能够做到这一点,所以你也不应该期望 SQLite 能够 sqlite3_step_backward()。
【讨论】:
这是更好的答案:-) 很好的解释。我被宠坏了,因为我使用的是“正常”的 FOXPRO,但解决方法只是标准 SQL 的东西。以上是关于是否可以有 [FMResultSet previous] 和/或 [FMResultSet goRecord:1]?的主要内容,如果未能解决你的问题,请参考以下文章
sql ELIMINACION DE UNA TABLA SI EXISTE,PREVIOS SQLSERVER 2016