2009-10-31 8 views
0

J'ai donc travaillé sur ce projet depuis un petit moment maintenant. Je n'ai aucun problème avec la lecture des données de la base de données, et le formatage dans UITableViews et quoi d'autre. Mais maintenant je veux aussi écrire à la DB. Le problème est que je continue d'obtenir une erreur "Database is Locked" de sqlite. Après avoir déconné avec la version originale, j'ai eu le moment de faire face à ma paume en réalisant que ma base de données était dans le paquet et donc pas inscriptible. J'ai donc déplacé la base de données dans le dossier Apps Documents, qui est accessible en écriture. Mais maintenant, je reçois toujours la même erreur sql "Database is Locked". Je n'ouvre et ne ferme la DB que lorsque c'est nécessaire. Et pour autant que je sache, je ne le laisse pas ouvert n'importe où. Voici le code où je veux faire des mises à jour. Des pensées?iPhone sqlite3 verrouillé, ne peut que lire, ne pas écrire

- (BOOL) loanBookTo:(NSString *)newborrower{ 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *path = [documentsDirectory stringByAppendingPathComponent:@"books.sqlite"]; 

     if([[NSFileManager defaultManager] fileExistsAtPath:path]){ 
      NSLog(@"File Exists at: %@", path); 
     } 


     if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) { 
      NSString *mySQL = @"UPDATE BOOKS SET LOANED = 1, BORROWER = \"<BORROWER>\" where ISBN = \"<ISBN>\""; 
      mySQL = [mySQL stringByReplacingOccurrencesOfString:@"<ISBN>" withString:self.isbn]; 
      mySQL = [mySQL stringByReplacingOccurrencesOfString:@"<BORROWER>" withString:newborrower]; 
      const char *sql = [mySQL UTF8String]; 
      char* errmsg; 
      sqlite3_exec(database, sql, NULL, NULL, &errmsg); 

      // Q. Database is locked. Why? 
      // A. Because it is in the Bundle and is ReadOnly. 
      // Need to write a copy to the Doc folder. 

      // Database is Locked error gets spit out here. 
      printf(errmsg); 
      sqlite3_close(database); 
     } 
     return NO; 
    } 
+0

Où se trouve la base de données, dans le regroupement d'applications ou le répertoire de documents? – zaph

Répondre

0

Ouvrez la base de données une fois au début de votre application, puis fermez-le dans applicationWillTerminate du AppDelegate.

Après chaque exécution, vous devrez effectuer une réinitialisation pour effacer l'état de la connexion.

Jetez un oeil à l'exemple d'application SQLiteBooks, il est codé de cette façon.

0

Comment déplacer la base de données vers le dossier de documents de l'ensemble? Vous devez vérifier qu'il est là, et sinon le copier. J'ai l'impression que vous l'avez copié d'une autre manière, mais que vous avez conservé un attribut en lecture seule ou, plus probablement, que vous faites toujours référence à l'original dans l'ensemble.

Pour plus de détails voir

Where would you place your SQLite database file in an iPhone app?

ou comme dit joshperry, l'échantillon de SQLiteBooks a tout le code dont vous avez besoin.

0

Comment allez-vous à loanBookTo? Si la base de données est ouverte et que vous appelez loanBookTo, il ne peut pas lancer une erreur d'ouverture, mais la base de données conserve l'état d'où vous venez.

De même, la base de données conserve parfois l'état verrouillé lors de la fermeture et de la fermeture de l'application, vous pouvez donc «hériter» d'un état verrouillé de vos échecs précédents. Supprimer l'application du simulateur devrait vous donner une copie propre.

Questions connexes