Jusqu'à présent tout mon accès base de données a été en train de lire, mais maintenant je dois mettre à jour (et après cet insert)verrouillé fichier SQLite sur iPhone
J'ai une base de données contenant « montre » dans le répertoire de l'application (lecture seule) et c'est bon pour moi (je ne veux pas le copier dans le dossier des documents car il est plutôt gros et je n'ai pas besoin de changer les choses.)
Mais je veux que l'utilisateur sélectionne certains spectacles comme son Par conséquent, j'ai créé une base de données avec une table 'favorite_shows' dans le dossier documents.Il contient 4 champs: ID (prim clé) show_id is_favorite remarques (actuellement non t encore en cours d'utilisation)
L'utilisateur peut changer l'état « is_favorite » UNE FOIS, après que je reçois une erreur lors de la tentative de mise à jour:
SQLITE_BUSY 5/* Le fichier de base de données est verrouillé */
Ceci est mon code:
if (sqlite3_open([databasePath UTF8String],&database) == SQLITE_OK){
sqlStatement = "select * from favorite_shows WHERE (show_id = ?)";
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_int(compiledStatement, 1, self.ID);
// search for a show
if(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// if we can find one, toggle the status
favID = sqlite3_column_int(compiledStatement, 0); // we need the primary key to update it
isFav = (sqlite3_column_int(compiledStatement, 2) == 1); // let's store the favorite status
sqlStatement = "update favorite_shows SET is_favorite = ? WHERE (ID = ?)";
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_int(compiledStatement, 1, !isFav);
sqlite3_bind_int(compiledStatement, 2, favID);
int error = sqlite3_step(compiledStatement);
if (SQLITE_DONE != error) {
NSLog(@"error while updating favorite status");
}
}
}
//else : no records found indicating that this show hasn't been a favorite yet, so insert one as favorite
sqlite3_finalize(compiledStatement);
sqlite3_close(database);
}
Quelle est la raison pour laquelle il est verrouillé la deuxième fois? Y a-t-il d'autres instructions à donner en plus: sqlite3_finalize (compiledStatement);
sqlite3_close (base de données); pour fermer tout?
Est-ce qu'il s'exécute dans un thread? – Rudiger
pas dans un fil séparé, juste dans le fil principal – Glenn