J'utilise FMDB pour traiter ma base de données qui fonctionne très bien. L'application utilise un thread d'arrière-plan qui effectue un travail et doit accéder à la base de données. En même temps, le thread principal doit exécuter certaines requêtes sur la même base de données. FMDB lui-même a un petit système de verrouillage, cependant, j'en ai ajouté un autre à mes cours.EXC_BAD_ACCESS lors de l'utilisation SQLite (FMDB) et les discussions sur iOS 4.0
Chaque requête est effectuée uniquement si ma classe indique que la base de données n'est pas utilisé. Après avoir effectué les actions, la base de données est déverrouillée. Cela fonctionne comme prévu tant que la charge n'est pas trop élevée. Lorsque j'accède à beaucoup de données avec le thread s'exécutant sur le thread principal, une erreur EXC_BAD_ACCESS se produit.
Voici la recherche:
- (BOOL)isDatabaseLocked {
return isDatabaseLocked;
}
- (Pile *)lockDatabase {
isDatabaseLocked = YES;
return self;
}
- (FMDatabase *)lockedDatabase {
@synchronized(self) {
while ([self isDatabaseLocked]) {
usleep(20);
//NSLog(@"Waiting until database gets unlocked...");
}
isDatabaseLocked = YES;
return self.database;
}
}
- (Pile *)unlockDatabase {
isDatabaseLocked = NO;
return self;
}
Le débogueur dit que l'erreur se produit à [FMResultSet next]
à la ligne
rc = sqlite3_step(statement.statement);
Je double vérifié tous les conserver compte et tous les objets existent à ce moment. Encore une fois, cela ne se produit que lorsque le thread principal démarre beaucoup de requêtes pendant que le thread d'arrière-plan est en cours d'exécution (qui lui-même produit toujours une charge importante). L'erreur est toujours produite par le thread principal, jamais par le thread d'arrière-plan.
Ma dernière idée serait que les deux fils courent lockedDatabase en même temps afin qu'ils puissent obtenir un objet de base de données. C'est pourquoi j'ai ajouté le verrouillage mutex via "@synchronized (self)". Cependant, cela n'a pas aidé.
Quelqu'un at-il une idée?
Ce fil pour une question FMDB donne un autre aperçu utile des causes possibles: https://github.com/ccgus/fmdb/issues/39 –