Domanda

Sto usando SQLite3 per lo sviluppo di iPhone e sto cercando di racchiudere alcune istruzioni di inserimento in una transazione. Attualmente ho il seguente codice che funziona correttamente, tuttavia dopo aver letto un'altra domanda su SO ho capito che sarebbe meglio averli in una transazione anziché in uno ciascuno. Non sono riuscito a trovare la chiamata API C per iniziare e eseguire una transazione. Parte del codice è in Objective-C ma non credo sia davvero pertinente alla domanda.

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

Quello che penso debba essere fatto sarebbe prendere il comando sqlite3_prepare_v2 fuori dal ciclo for, avviare la transazione, passare attraverso il ciclo for, eseguire il commit della transazione. Tuttavia, non sono sicuro di ciò che richiede "avviare la transazione" e " eseguire la transazione " siamo. E dovrei ancora usare sqlite3_step? Grazie per il tuo aiuto.

È stato utile?

Soluzione

Inizia una transazione con: sqlite3_exec (db, " BEGIN " ;, 0, 0, 0);

Effettua una transazione con: sqlite3_exec (db, " COMMIT " ;, 0, 0, 0);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top