Frage

Ich bin mit SQLite3 für iPhone Entwicklung und ich bin versucht, ein paar Insert-Anweisungen in einer Transaktion zu wickeln. Zur Zeit habe ich den folgenden Code, der nach der Lektüre eine andere Frage richtig jedoch arbeitet an SO erkannte ich, es wäre besser, diese in einer einzigen Transaktion zu haben, als ein jeder. Ich konnte nicht den C-API-Aufruf finden beginnen und eine Transaktion zu begehen. Einige der Code ist in Objective-C, aber ich glaube nicht, dass auf die Frage wirklich relevent ist.

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

Was denke ich getan werden muss, würde die sqlite3_prepare_v2 Befehl Entnahme der for-Schleife, starten Sie die Transaktion, gehen Sie durch die for-Schleife, begehen die Transaktion. Allerdings bin ich mir nicht sicher, was die Forderung nach „um die Transaktion starten“ und „verpflichten, die Transaktion“ ist. Und würde ich noch sqlite3_step benutzen? Vielen Dank für Ihre Hilfe.

War es hilfreich?

Lösung

Starten Sie eine Transaktion mit: sqlite3_exec(db, "BEGIN", 0, 0, 0);

eine Transaktion mit: sqlite3_exec(db, "COMMIT", 0, 0, 0);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top