2011-02-03 92 views
1

我需要在iPhone應用程序中插入一堆數據,但在不同的表中。表名在這個數據中。插入到SQlite的不同表中

這就是我要怎樣做:

NSString *statement = @"insert into ? values (?, ?, 0)"; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, [statement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 
     for(UpdateItems *item in updateData){ 
      sqlite3_bind_text( compiledStatement, 1, [item.table UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text( compiledStatement, 2, [item.code UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text( compiledStatement, 3, [item.data UTF8String], -1, SQLITE_TRANSIENT); 

      while(YES){ 
       NSInteger result = sqlite3_step(compiledStatement); 
       if(result == SQLITE_DONE){ 
        break; 
       } 
       else if(result != SQLITE_BUSY){ 
        break; 
       } 
      } 
      sqlite3_reset(compiledStatement); 
     } 
    } else 
     printf("db error: %s\n", sqlite3_errmsg(database)); 

    sqlite3_finalize(compiledStatement); 
    sqlite3_close(database); 

當運行上面的腳本我得到的錯誤:沒有這樣的表:這是正常的,因爲在sqlite3_prepare_v2語句數據尚未綁定,所以SQLite不知道該表。

現在我將移動循環內部的sqlite3_prepare_v2塊並使用stringWithFormat我將更改帶有表名的第一個問號並在做好準備之後,但是還有其他解決方案嗎?更簡單嗎?

回答

1

這是最簡單的正確解決方案。

但是,每次沒有準備查詢都有性能優勢。如果性能是一個問題,那麼我建議創建一個從表名到準備查詢的映射。那麼您只需在第一次遇到表名時準備查詢。

+0

謝謝。映射的想法很好。但是,畢竟我使用了最簡單的解決方案。 – CristiC 2011-02-04 08:11:33