2012-02-27 10 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];を呼び出した後、テーブルは削除されません。

削除するには、テーブルには、SQLを受け入れるだけのsqlite3_execです:[NSString stringWithFormat:@"DROP TABLE IF EXISTS '%@'", tableName]

これはなぜですか?それは私がループしている間にデータベースが使用されているからですか?結果を配列に入れて、ループしてテーブルを削除する方が良いでしょうか?例外はスローされない/クラッシュし、execが実行されています。

答えて

1

削除するたびにsqlite3_finalizeを使用してファイナライズを試してください。

希望すると、これが役立ちます。

+0

私はあなたが文章ではなく削除時にsqlite3_execをファイナライズすると思いますか? – JonWells

+0

はい。私はあなたが本当にデータベースに影響を与えるすべての呼び出しの後にファイナライズする必要があることがわかった。 –

関連する問題