SQLiteはTRUNCATEをサポートしない
FMDBを使って更に抽象度を上げたSQLiteのユーティリティを書いているのだが、以下のようなテーブルを削除するコードを書いても上手くいかない。
DBHelper.m
@synthesize db; - (void)deleteTable:(NSString*)tableName; } [db open]; @try { if ([db tableExists:tableName]) { NSString* sql = [[NSString alloc] initWithFormat:@"TRUNCATE TABLE %@", tableName]; BOOL result = [db executeUpdate:sql]; if (!result) { [dbHelper logDBError:sql]; } } } @finally { [db close]; } } - (void)logDBError:(NSString*)sql; { LogError(@"** SQLite Error SQL : %@", sql); LogError(@"** ErrorCode: %d", db.lastErrorCode); LogError(@"** LastError: %@", db.lastError); }
それもそのはず、SQLiteはTRUNCATEをサポートしないのだった。
SQLite Query Language: DELETE
なのでSQLを以下のように修正することで期待通り動作した。
NSString* sql = [[NSString alloc] initWithFormat:@"DELETE FROM %@", tableName];
知ってる人からみるとアホらしいミスだ。
Androidで提供されていたユーティリティにどれだけ助けられていたか、ということだな。