2010-09-13 5 views
1

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?

+0

Est-ce qu'il s'exécute dans un thread? – Rudiger

+0

pas dans un fil séparé, juste dans le fil principal – Glenn

Répondre

8

EDIT:

Le BUSY est le résultat de réutilisant compiledStatement sans supprimer le statment précédemment compilé. Vous devez libérer les ressources correctement en utilisant les fonctions de finalisation et de fermeture. Référez-vous aux documents ici. http://sqlite.org/c3ref/stmt.html

const char * select = "select * from favorite_shows WHERE (show_id = ?)"; 
const char * update = "update favorite_shows SET is_favorite = ? WHERE (ID = ?)"; 

sqlite3_stmt *selectStmt; 
sqlite3_stmt *updateStmt; 


if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
    if(sqlite3_prepare_v2(database, select, -1, &selectStmt, NULL) == SQLITE_OK) { 
     sqlite3_bind_int(selectStmt, 1, self.ID); 
     // search for a show 
     if(sqlite3_step(selectStmt) == SQLITE_ROW) { 
      // if we can find one, toggle the status 
      favID  = sqlite3_column_int(selectStmt, 0); // we need the primary key to update it 
      isFav  = (sqlite3_column_int(selectStmt, 2) == 1) ? 0 : 1; // Flip is_favorite value 
      sqlite3_finalize(selectStmt); // Delete the statement OR create a new one 

      if(sqlite3_prepare_v2(database, update, -1, &updateStmt, NULL) == SQLITE_OK) { 
       sqlite3_bind_int(updateStmt, 1, isFav);     
       sqlite3_bind_int(updateStmt, 2, favID); 
       int error = sqlite3_step(updateStmt); 
       if (SQLITE_DONE != error) { 
        NSLog(@"error while updating favorite status"); 
       } else { 
       sqlite3_finalize(updateStmt); 
       } 
      } 
    } //else : no records found indicating that this show hasn't been a favorite yet, so insert one as favorite 
} 
    sqlite3_close(database); 
} 
+0

cela a vraiment fait l'affaire! Merci beaucoup ! – Glenn

+0

Pourquoi ne le marquez-vous pas correctement alors? – Rudiger

+0

@falconcreek quel est ce self.ID? –

Questions connexes