是否可以[FMResultSet previous]和/或[FMResultSet goRecord:1]?

时间:2013-05-06 19:59:34

标签: ios6 sqlite fmdb uitableview

要使用sqlite填充UITableViews,我将所有数据复制到NSArrays / Dicts,这样我就可以在列表中返回/前进。然而,这是浪费和需要两次数据。

我想知道是否可以拥有[FMResultSet previous]和/或[FMResultSet goRecord:RECNO]所以我可以摆脱副本并直接使用FMResultSet。

那么sqlite API提供了这种可能性吗?

1 个答案:

答案 0 :(得分:2)

有一个很好的article,理查德希普,SQLite的创造,写了为什么SQLite没有倒退的功能,以及为什么这是一个非常难的问题。本文还提供了一些您可能感兴趣的解决方法。

引用该文章,

  

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

     

但这根本不容易。实际上,SQLite的设计者一直无法想到在一般情况下能够完成工作的算法。对于某些特殊情况,例如上面的简单示例查询,可以轻松地在结果集中向后退。但事情变得更复杂,例如,如果查询实际上是结果列和WHERE子句中包含子查询的4向LEFT OUTER JOIN。

     

问题是sqlite3_step()函数根本不会逐步执行预先计算的结果集。考虑问题的一种更好,更现实的方法是假设每个准备好的声明都是一个计算机程序。您正在调试器中运行此程序,并且在计算内部的某个位置的单个语句上设置了断点。调用sqlite3_step()函数就像按下调试器中的“运行”按钮,从而要求调试器运行程序,直到它退出或命中断点。 Sqlite3_step()如果遇到断点则返回SQLITE_ROW,如果完成则返回SQLITE_DONE。如果您点击断点,则可以查看局部变量以查找“行”的值。然后你可以再次按“运行”按钮(再次调用sqlite3_step())继续执行,直到下一个断点或程序退出。

     

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