2012-02-27 60 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];後,表格未被刪除。

刪除表只是一個sqlite3_exec其接受SQL:[NSString stringWithFormat:@"DROP TABLE IF EXISTS '%@'", tableName]

這是爲什麼?是否因爲我在循環中正在使用數據庫?我會更好地把結果放在一個數組中,而不是以這種方式循環和刪除表?沒有異常拋出/崩潰等,執行正在執行。

回答

1

嘗試在每次刪除後使用sqlite3_finalize完成。

希望這可以幫助你。

+0

我假設你的意思是敲定sqlite3_exec上的刪除而不是陳述? – JonWells 2012-02-27 16:36:58

+0

是的。我發現在任何影響數據庫的調用之後,你真的必須調用finalize。 – 2012-02-27 18:13:38