2013-05-06 66 views
0

要使用sqlite填充UITableViews,我將所有數據都複製到NSArrays/Dicts,以便我可以在列表中前進/後退。然而,這是浪費和要求數據兩次。可能有[FMResultSet previous]和/或[FMResultSet goRecord:1]?

我想知道是否有可能有[FMResultSet previous]和/或[FMResultSet goRecord:RECNO]所以我可以擺脫副本並直接使用FMResultSet。

那麼sqlite API提供了這種可能性?

回答

2

Richard Hipp是SQLite的創建者,他寫了一個很好的article,它寫了爲什麼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()。

+0

這是:-) – 2013-05-07 07:19:56

+0

很好的解釋了更好的答案。我被寵壞了,因爲我已經使用FOXPRO,這是「正常」,但解決方法只是標準的SQL東西。 – mamcx 2013-05-07 15:56:07