2012-03-05 55 views
2

環境:可可在Mac OS X Snow Leopard的SQLite的表達最大深度限制

我已經達到了一個SQLite查詢的上限(默認)深度:

Expression tree is too large (maximum depth 1000) 

sqlite的documentation說來設置SQLITE_MAX_EXPR_DEPTH在彙編,但如何?我使用默認sqlite3的框架,用進口:

#import <sqlite3.h> 

注:我認爲最大表達深度可在運行時降低(不增加)有:

sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) 

這是正確的?

+0

有沒有這樣的運氣? – QED 2012-03-06 04:09:49

回答

2

你對所有的斷言都是正確的(這是一個編譯時設置,它可以在運行時不降低)。您的選擇是限制您的查詢或將自定義版本的SQLite與生產應用程序鏈接起來。

SQLite的好處在於它的構建非常簡單。閱讀關於custom builds。此外,蘋果的OS X 10.6.8的SQLite XCode項目是here。無論您使用Apple的項目還是創建自己的項目,都可以輕鬆創建共享庫,將靜態鏈接導入您的可執行文件以隨項目一起發佈。在發佈代碼時,您將不得不擔心兼容性問題,但這是您爲複雜查詢付出的代價。

您還可以在另一個問題上詢問如何簡化複雜查詢。

+1

賓果!謝謝!自動回答後人: 爲了解決這個問題,我使用sqlite3 [合併] [1](ZIP存檔包含SQLite 3.7.10的所有C源代碼合併成一個源文件),步驟: 1. download最終導入sqlite.h和.C在項目 2.拆下源碼框架 3.找到SQLITE_MAX_EXPR_DEPTH 1000 sqlite.c與SQLITE_MAX_EXPR_DEPTH 0 享受更換;) [1]:HTTP:// WWW。 sqlite.org/sqlite-amalgamation-3071000.zip – Kappe 2012-03-06 10:57:38

3

更簡單的解決方案(雖然遠非完美)。

我有同樣的錯誤,我不得不使用Android默認的SQLite實現(查詢系統音頻數據庫)。

這個問題出現了,因爲我刪除了一些「無用的」括號,所以我把它們放回去了,沒有更多的錯誤。

崩潰:

id = 387 OR id = 388 OR id = 390 OR id = 391 [...] OR id = 392 

不會崩潰:

(id = 387 OR id = 388 [...] OR id = 390) OR (id = 391 [...] OR id = 392) OR (... 

我幸運,因爲我的括號是無論如何也有意義,可以很容易地放置。 不是很乾淨,但它有助於顯着減少崩潰,所以我很高興在這種情況下。