2009-01-16 6 views
1

Je fais une application avec de nombreuses opérations de base de données. Comme SQLite met en cache des données, dans ma méthode applicationDidReceiveMemoryWarning, je ferme la base de données et je l'ouvre à nouveau pour supprimer les données mises en cache.Fin de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'Erreur: impossible d'ouvrir la base de données avec le message' pas une erreur '.'

Lorsque le faire, je reçois cette erreur

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error: failed to open database with message 'not an error'.'

Voici le code que je utilise pour fermer la base de données et ouvrir à nouveau où la base de données est de type sqlite3 * [MySQLInter finalizeStatements];

if(sqlite3_close(database) == SQLITE_OK){ 

//open again 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mydb.sql"]; 


    if(sqlite3_open([path UTF8String], &database) != SQLITE_OK){ 

     NSAssert1(0, @"Error: failed to open database with message '%s'.", sqlite3_errmsg(database)); 

} 

} 

else{ 

NSAssert1(0, @"Error: failed to close database on memwarning with message '%s'.", sqlite3_errmsg(database)); 

} 

Comment éviter cela?

Répondre

1

Etes-vous sûr de ne pas vouloir dire "! = SQLITE_OK" dans l'appel sqlite3_open?

1

sqlite3_open renvoie un code d'erreur. Vous venez de le vérifier pour SQLITE_OK - il serait intéressant de voir exactement ce qu'il retourne. S'il ne s'ouvre pas, il n'est pas correct d'appeler sqlite3_errmsg sur la base de données car il n'a pas ouvert la base de données, de sorte que cet objet peut ne pas être rempli correctement.

Dans votre erreur catch conditionnel, imprimez la valeur du retour de sqlite3_open à la place, et nous serons en mesure d'aider mieux.

Questions connexes