Pregunta

Estoy usando SQLite3 para el desarrollo de iPhone y estoy tratando de envolver algunas declaraciones de inserción en una transacción. Actualmente tengo el siguiente código que funciona correctamente; sin embargo, después de leer otra pregunta sobre SO, me di cuenta de que sería mejor tener esto en una transacción en lugar de en una. No pude encontrar la llamada C API para comenzar y confirmar una transacción. Parte del código está en Objective-C, pero no creo que sea realmente relevante para la pregunta.

- (void)saveAnimals {
    //Insert all the animals into the zoo database
    int i;

    const char *sql = "insert into Animal(Zoo_ID, Animal_Num, Animal_Text) Values(?, ?, ?)";
    for (i = 0; i < ([[self animalArray] count] - 1); i++) {

        if(addStmt == nil) {
            if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
        }
        int animalNum = [[[self animalArray] objectAtIndex:i] animal_Number];
        NSString *animalText = [[NSString alloc] initWithString:[[[self animalArray] objectAtIndex:i] animal_Text]];
        sqlite3_bind_int(addStmt, 1, zoo_ID);   
        sqlite3_bind_int(addStmt, 2, animalNum);    
        sqlite3_bind_text(addStmt, 3, [animalText UTF8String], -1, SQLITE_TRANSIENT);
        [animalText release];
        if(SQLITE_DONE != sqlite3_step(addStmt)) {
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
        }

        //Reset the add statement.
        sqlite3_reset(addStmt);     
    }
}

Lo que creo que hay que hacer sería sacar el comando sqlite3_prepare_v2 del bucle for, iniciar la transacción, pasar por el bucle for, confirmar la transacción. Sin embargo, no estoy seguro de cuáles son las llamadas para " iniciar la transacción " y "confirmar la transacción" son. ¿Y seguiría usando sqlite3_step? Gracias por tu ayuda.

¿Fue útil?

Solución

Inicie una transacción con: sqlite3_exec (db, " BEGIN " ;, 0, 0, 0);

Confirmar una transacción con: sqlite3_exec (db, " COMMIT " ;, 0, 0, 0);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top