Estoy usando FMDB para tratar con mi base de datos que funciona bien. La aplicación utiliza un hilo de fondo que está trabajando y necesita acceder a la base de datos. Al mismo tiempo, el hilo principal necesita ejecutar algunas consultas en la misma base de datos. El propio FMDB tiene un pequeño sistema de bloqueo, sin embargo, agregué otro a mis clases.EXC_BAD_ACCESS al usar SQLite (FMDB) y subprocesos en iOS 4.0
Cada consulta solo se realiza si mi clase indica que la base de datos no está en uso. Después de realizar las acciones, la base de datos se desbloquea. Esto funciona como se espera siempre que la carga no sea demasiado alta. Cuando accedo a una gran cantidad de datos con el subproceso que se ejecuta en el subproceso principal, se produce un error EXC_BAD_ACCESS.
Aquí está el futuro:
- (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;
}
El depurador dice que el error se produce en [FMResultSet next]
en la línea de
rc = sqlite3_step(statement.statement);
Me doble comprobado todos conservan existen recuentos y todos los objetos en este momento. De nuevo, solo ocurre cuando el hilo principal inicia muchas consultas mientras se ejecuta el hilo de fondo (que a su vez produce una gran carga). El error siempre es producido por el hilo principal, nunca por el hilo de fondo.
Mi última idea es que ambos hilos ejecutan lockedDatabase al mismo tiempo para que puedan obtener un objeto de base de datos. Es por eso que agregué el bloqueo mutex a través de "@synchronized (self)". Sin embargo, esto no ayudó.
¿Alguien tiene una pista?
Este hilo para un problema FMDB da alguna otra información útil sobre las posibles causas: https://github.com/ccgus/fmdb/issues/39 –