0

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

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

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

4

1 回答 1

2

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。如果您命中断点,则可以查看局部变量以查找“行”的值。然后你可以按“运行”

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

于 2013-05-07T06:45:12.777 回答