Ios6 是否可能有[FMResultSet-previous]和/或[FMResultSet-goRecord:1]?

Ios6 是否可能有[FMResultSet-previous]和/或[FMResultSet-goRecord:1]?,ios6,sqlite,fmdb,uitableview,Ios6,Sqlite,Fmdb,Uitableview,为了使用sqlite填充UITableView,我将所有数据复制到NSArray/Dicts,以便在列表上来回移动。然而,这是浪费,需要有两次数据 我想知道是否可以有[FMResultSet previous]和/或[FMResultSet goRecord:RECNO],这样我就可以摆脱副本,直接使用FMResultSet了 所以sqlite API提供了这种可能性?有一个好消息,sqlite的创建者Richard Hipp写过,为什么sqlite没有后退的功能,以及为什么这通常是一个非常困难

为了使用sqlite填充UITableView,我将所有数据复制到NSArray/Dicts,以便在列表上来回移动。然而,这是浪费,需要有两次数据

我想知道是否可以有
[FMResultSet previous]
和/或
[FMResultSet goRecord:RECNO]
,这样我就可以摆脱副本,直接使用FMResultSet了

所以sqlite API提供了这种可能性?

有一个好消息,sqlite的创建者Richard Hipp写过,为什么sqlite没有后退的功能,以及为什么这通常是一个非常困难的问题。本文还提供了一些您可能会感兴趣的解决方法

引用那篇文章,

上面的sqlite3_step()函数似乎在结果集中向前移动光标。然后很自然地会问为什么没有相应的sqlite3_step_backwards()函数在结果集中向后移动。看来sqlite3_step_backward()毕竟应该很容易实现。只需在结果集中后退,而不是向前

但这一点也不容易。事实上,SQLite的设计者一直无法想出一种在一般情况下可以完成这项工作的算法。对于某些特殊情况,向后遍历结果集是很容易的,例如上面的简单示例查询。但是事情会变得更复杂,例如,如果查询实际上是一个4路左外连接,在结果列和WHERE子句中都有子查询

问题是sqlite3_step()函数根本不单步遍历预计算的结果集。思考问题的一个更好、更现实的方法是假设每个准备好的声明实际上都是一个计算机程序。您在调试器中运行此程序,并且在计算深处的某个语句上设置了一个断点。调用sqlite3_step()函数类似于按下调试器中的“运行”按钮,从而要求调试器运行程序,直到程序退出或到达断点。Sqlite3_step()如果命中断点,则返回SQLITE_行;如果完成,则返回SQLITE_DONE。如果遇到断点,则可以查看局部变量以查找“行”的值。然后,您可以再次按下“运行”按钮(调用sqlite3_step())继续执行,直到下一个断点或程序退出

从这个角度来看(更接近SQLite内部的工作方式),要求使用sqlite3_step_backward()按钮实际上就像期望符号调试器能够向后运行或“撤消”其执行回到上一个断点。没有人合理地期望调试器能够做到这一点,所以您也不应该期望SQLite能够sqlite3_step_backward()


这是更好的答案:-)很好的解释。我被宠坏了,因为我使用了FOXPRO,这是“正常的”,但解决方法只是标准的SQL内容。