2011-02-03 5 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