Question

J'utilise SQLite3 pour le développement d'un iPhone et j'essaie d'envelopper quelques instructions d'insertion dans une transaction. Actuellement, j'ai le code ci-dessous qui fonctionne correctement, mais après avoir lu une autre question sur SO, je me suis rendu compte qu'il serait préférable de les avoir en une seule transaction plutôt qu'en une seule. Je n'ai pas trouvé l'appel de l'API C pour commencer et valider une transaction. Une partie du code est en Objective-C mais je ne pense pas que cela soit vraiment pertinent pour la question.

- (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);     
    }
}

Ce qui, à mon avis, doit être accompli serait de supprimer la commande sqlite3_prepare_v2 de la boucle for, de démarrer la transaction, de parcourir la boucle for, de valider la transaction. Cependant, je ne suis pas sûr de savoir ce que les appels "Démarrer la transaction" et " valider la transaction " sont. Et utiliserais-je toujours sqlite3_step? Merci pour votre aide.

Était-ce utile?

La solution

Commencez une transaction avec: sqlite3_exec (db, "BEGIN", 0, 0, 0);

Commettez une transaction avec: sqlite3_exec (db, "COMMIT", 0, 0, 0);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top