2012-05-08 6 views
1

したがって、DBから一連のオブジェクトをすべて削除します。NSMutableArrayを使用してdbからレコードを削除する

NSMutableArrayに一時的に格納されます。

これは私がそれらをループする現在のコードです。

+(BOOL) removeLogs:(Logs *)logs { 
Database *db = [DatabaseManager sharedDatabaseManager].db; 

sqlite3_exec(db.dataBase, "BEGIN", 0, 0, 0); 
const char *sqlRemoveLogs = "DELETE FROM logs WHERE LogID = ?"; 
if(sqlite3_prepare_v2(db.dataBase, sqlRemoveLogs, -1, &removeLogStatement, NULL) != SQLITE_OK) { 
    NSLog(@"Failed to prepare statement: %s", sqlite3_errmsg(db.dataBase)); 
    return NO; 
} 

for(int i = 0; i < logs.getLogs.count; i++) { 
    sqlite3_bind_int(removeLogStatement, 1, [logs getLogAtIndex:i].logId); 

    if(SQLITE_DONE != sqlite3_step(removeLogStatement)) { 
     NSLog(@"Failed to remove logs: %s", sqlite3_errmsg(db.dataBase)); 
     return NO; 
    } 

    sqlite3_clear_bindings(removeLogStatement); 
    sqlite3_reset(removeLogStatement); 
} 

sqlite3_finalize(removeLogStatement); 

NSLog(@"Logs removed"); 
return YES; 
} 

私はここでforループを使用して反復処理を行う必要がある形式でこれを取得します。 sqliteのための次の文を使用して:

DELETE FROM logs WHERE LogID IN ? 

どのように私はこれを埋めますか '?' NSMutableArrayで? これも可能ですか?

事前に多くの感謝

EDIT: 「ログ」オブジェクトは、あなたがlogIdsToDeleteArrayでそれを削除して保存したいlogIdsNSArrayを作るNSMutableArrayの

答えて

1

です。

次に、次の手順を実行します。

ステップ1:

NSString * logIdsToDelete = [[logIdsToDeleteArray valueForKey:@"description"] componentsJoinedByString:@","]; 

結果:配列の要素が結合し、カンマで区切られた要素の文字列になります。

ステップ2:

NSString *logIdsToDelete = [NSString stringWithFormat:@"{%@}", logIdsToDelete]; 

結果:

NSString *s = [NSString stringWithFormat:@"DELETE FROM logs WHERE LogID IN %@", logIdsToDelete]; 

結果:NSStringとして必要なSQL文{要素1、要素2、要素3 ..} NSString

ステップ3として

手順4:

const char *sql = [s cStringUsingEncoding:NSASCIIStringEncoding]; 

結果:const char

sqlite3の互換性あなたが実行して、あなたのコードスニペットで行われているように進行するSQL文を取得します。

関連する問題