我想在我的iOS項目中使用FTS。通過對SO(例如this)和其他來源(如this)這裏的問題的一些答案,我明白我將不得不在iOS上推出我自己構建的sqlite3,從而將依賴項替換爲默認libsqlite3.dylib。蘋果現在在標準/內置的sqlite庫中啓用了FTS嗎?
但是,當我直接運行查詢(在一個新的項目,只用「libsqlite3.dylib」鏈接標準,沒有自定義源碼編譯):通過使用創建的表「頁」
"SELECT rowid FROM pages WHERE textcontent MATCH 'jim';"
查詢:
"CREATE VIRTUAL TABLE pages USING fts3(textcontent TEXT)",
我沒有得到任何錯誤,相反,我得到正確的結果(該行的ROWID在「吉姆」字存在)彷彿FTS被defalt在啓用內置的iOS sqlite庫。
那麼,情況是這樣嗎?蘋果現在是否在標準/內置的sqlite庫中啓用了FTS?或者有什麼我在這裏失蹤?
謝謝。
PS。我在我的項目中使用FMDB作爲一個sqlite包裝,這裏是我用來測試上述代碼。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *dbDocumentsPath = [documentsDir stringByAppendingPathComponent:@"1.db"];
FMDatabase *db = [FMDatabase databaseWithPath:dbDocumentsPath];
if (![db open])
NSLog(@"Could not open db.");
if([db executeUpdate:@"CREATE VIRTUAL TABLE pages USING fts3(textcontent TEXT)"])
NSLog(@"Virtual Table Created");
if([db executeUpdate:@"INSERT INTO pages(textcontent) VALUES ('Jack')"])
NSLog(@"First Insert Done");
if([db executeUpdate:@"INSERT INTO pages(textcontent) VALUES ('jim is jam')"])
NSLog(@"Second Insert Done");
FMResultSet* resultSet1 = [db executeQuery:@"SELECT rowid FROM pages WHERE textcontent MATCH 'jim';"];
while([resultSet1 next])
NSLog(@"%@",[resultSet1 objectForColumnName:@"rowid"]);
好了,正如我所說的,試圖在蘋果編譯libsqlite3.dylib FTS查詢時我沒有得到任何錯誤,但是當我用我們自己的替換編譯靜態源碼具有庫FTS手動禁用(通過去除從sqlite.c宏的#define SQLITE_ENABLE_FTS3),我得到的follwing錯誤 「錯誤調用sqlite3_step(1:沒有這樣的模塊:FTS3)SQLITE_ERROR」。 當我再次手動啓用FTS通過從sqlite.c添加宏#define SQLITE_ENABLE_FTS3,錯誤消失,我得到所需的輸出。這讓我更相信,蘋果默認啓用了FTS。謝謝。 – archeopetrix 2012-01-09 16:16:49
您使用的是哪個版本的iOS? – SK9 2012-01-31 09:48:22
我正在使用iOS 5。 – archeopetrix 2012-01-31 13:26:12