2012-05-20 77 views
0

這是我的情況,我想使用的NSString變量選擇查詢:在選擇查詢代替變其值

NSString *[email protected]"element1, element2, element3"; 
if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
    { 
     NSString *querySQL = [NSString stringWithFormat: 
           @"SELECT * from table1 where type IN ?"]; 

     const char *query_stmt = [querySQL UTF8String]; 


     if (sqlite3_prepare_v2(contactDB, 
           query_stmt, -1, &statement, NULL) == SQLITE_OK) 
     { 
      sqlite3_bind_text(statement, 1, [arrayThemeList UTF8String], -1, SQLITE_TRANSIENT); 

      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 

       //Do the rest work... 

很明顯,我想用arrayThemeList到查詢與bind聲明。

然而,這似乎並沒有被賦予想要的結果,是有什麼我做錯了什麼? Thanx提前:)

回答

0

IN子句應該用括號括起來的條目。嘗試:

 NSString *querySQL = [NSString stringWithFormat: 
          @"SELECT * from table1 where type IN (?)"]; 

而且,你的字符串需要被封閉,因此改變第一行是:

NSString *[email protected]"'element1', 'element2', 'element3'"; 

生成的查詢應該是:

SELECT * from table1 where type IN ('element1', 'element2', 'element3') 
+0

嗨,thanx爲您的答覆:)不幸的是,我什麼也沒有:( – Luca

0

如果綁定變量添加到IN列表的某些部分,您需要圍繞IN列表添加一些括號,並且每個單獨的值必須有一個佔位符(問號):

SELECT * FROM table1 WHERE type IN (?, ?, ?); 

然後綁定三個單獨的值,每個佔位符一個。沒有辦法(在大多數SQL DBMS中;我認爲不是在SQLite中)將值列表綁定到單個佔位符。

如果您只將數據作爲單個字符串獲取,那麼您在準備語句之前必須格式化SQL,並且您放棄了重複使用具有不同值的準備語句的功能,並且您必須擔心SQL Injection。此外,如果您正在處理字符串值,則需要將每個字符串括在單引號中(並且通過將所有嵌入的單引號加倍–來轉義–)。