2012-02-27 2 views
1

아래 코드는 부분적으로 작동합니다. 그것 sqlite_master 테이블에있는 모든 테이블을 반환하고 그들을 삭제하기로되어 있습니다.SQLite_master 테이블을 반복하고 테이블을 삭제하십시오.

NSString *sql = [NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table';"]; 

     sqlite3_stmt *statement = [database prepare:sql]; 
     if(statement != nil) 
     { 
      while(sqlite3_step(statement) == SQLITE_ROW) 
      { 
       NSString* currentTable = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; 
       if ([currentTable rangeOfString:@"sqlite"].location == NSNotFound && 
        [currentTable rangeOfString:@"Setting"].location == NSNotFound) 
       { 
        NSLog(@"current table: %@", currentTable); 
        [database deleteTable: currentTable]; 
       } 
      } 
      sqlite3_finalize(statement); 
     } 

그러나 [database deleteTable: currentTable];를 호출 한 후 테이블이 삭제되지 않습니다. 왜이 [NSString stringWithFormat:@"DROP TABLE IF EXISTS '%@'", tableName]

입니다 :

삭제 테이블은 SQL을 받아들이는 sqlite3_exec입니까? 그것은 내가 데이터베이스를 사용하고있는 루프에 있기 때문에 그렇습니까? 결과를 배열에 넣는 것이 더 좋을까요? 그런 식으로 반복하고 삭제하는 것보다 낫지 않습니까? 예외가 발생하지 않습니다/충돌 등 exec가 실행되고 있습니다.

답변

1

삭제할 때마다 sqlite3_finalize을 사용하여 마무리를 시도하십시오.

희망이 도움이됩니다.

+0

나는 statment가 아니라 삭제시 sqlite3_exec를 마무리한다고 가정하십니까? – JonWells

+0

예. 필자는 데이터베이스에 영향을주는 호출 후에 finalize를 호출해야한다는 것을 알게되었습니다. –

관련 문제