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が実行されています。
私はあなたが文章ではなく削除時にsqlite3_execをファイナライズすると思いますか? – JonWells
はい。私はあなたが本当にデータベースに影響を与えるすべての呼び出しの後にファイナライズする必要があることがわかった。 –