2

朝のてっぺんとーや!

私は現在、Objective-c で iOS アプリを開発しており、ユーザーがインターネット経由で更新できるローカル データベースを持っています。データベースはわずか数日でかなり大幅に変更される可能性があり、以前は数十万だった行がすべて数行に削減された可能性があります (可能性は低いですが、それでもなお)。

私は sqlite を使用しており、トランザクションの削除を実行しようとしていますが、次のコードの実行中にエラーは発生しませんが、望ましい効果がありません。つまり、削除する必要がある行が削除されていません!

前、中、後にデータベースで選択クエリを実行しましたが、削除されるべきデータが常に見つかります。

ここにコードがあります

@try {
    if(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK){
        //Db exists and can be open
        sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);
        sqlite3_stmt *stmt;
        const char *query = [[NSString stringWithFormat:@"DELETE FROM %@ 
                                                          WHERE ? = '?'", table] UTF8String];
        if(sqlite3_prepare_v2(db, query, -1, &stmt, NULL)== SQLITE_OK)
        {
            //integer i = 0
            //PrimaryKey contains k primaryKeys
            for(int i=0; i<[primaryKey count]; i++){
                //i = j < k
                sqlite3_bind_text(stmt, 1, (const char *)[parameters UTF8String]
                 , [parameters lengthOfBytesUsingEncoding:NSUTF8StringEncoding], SQLITE_STATIC);
                sqlite3_bind_text(stmt, 2, 
             (const char *)[[primaryKey objectAtIndex:i] UTF8String]
            , [[primaryKey objectAtIndex:i] lengthOfBytesUsingEncoding:NSUTF8StringEncoding ]
            , SQLITE_STATIC);

                if (sqlite3_step(stmt) != SQLITE_DONE){
                    NSLog(@"Delete commit failed. Error %s", sqlite3_errmsg(db));
                    return NO;
                }
                if(sqlite3_reset(stmt)!= SQLITE_OK){
                    NSLog(@"SQL error %s", sqlite3_errmsg(db));
                    return NO;
                }
            }
            //i = k
        }
        if(sqlite3_exec(db, "COMMIT TRANSACTION", 0, 0, 0) != SQLITE_OK){
            NSLog(@"SQL error %s", sqlite3_errmsg(db));

            return NO;
        }
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return YES;
    }
    NSLog(@"SQL error %s", sqlite3_errmsg(db));
    sqlite3_close(db);
    return NO;
}
@catch (NSException *exception) {
    NSLog(@"%@", [exception reason]);
    return NO;
}

sqlite でのトランザクションの使用に慣れている方からのヘルプやヒントをいただければ幸いです。

4

1 に答える 1

3

あなたはの結果をチェックしていません

sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);

余分な引用符があります

WHERE ? = '?'

これらの引用符は必要ありませんsqlite3_bind_text

パラメーター 1 の列名をバインドしようとしていると思われます。これは SQLite では実行できません。sqlite3_prepare_v2列名を知る必要があります。クエリは、列の名前をパラメーター 2 と比較するだけです。

于 2012-10-17T15:08:24.910 に答える