Es perfectamente posible, solo necesita serializar el acceso a SQLite en su hilo de fondo.
Mi respuesta en this recent question debe apuntarle en la dirección correcta, creo.
Como se mencionó en otra parte, SQLite está bien para lecturas concurrentes, pero se bloquea en el nivel de base de datos para escrituras. Eso significa que si estás leyendo y escribiendo en diferentes subprocesos, obtendrás SQLITE_BUSY y SQLITE_LOCKED errors.
La forma más sencilla de evitar esto es serializar todo acceso DB (lectura y escritura), ya sea en una cola de distribución o un NSOperationQueue
que tiene una concurrencia de 1. Como este acceso no está teniendo lugar en el hilo principal , su UI no se verá afectada.
Esto obviamente detendrá las lecturas y escrituras superpuestas, pero también detendrá las lecturas simultáneas. No está claro si se trata de un golpe de rendimiento que puede tomar o no.
para inicializar una cola como se describió anteriormente:
NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];
[backgroundQueue setMaxConcurrentOperationCount:1];
continuación, sólo puede añadir a la cola de operaciones como mejor le parezca.
¿Has probado afinando las consultas que usas y mirando los planes de consulta para ver si se necesitan índices? –
¿Está utilizando transacciones cuando realiza varias escrituras? Deberías - hace una gran diferencia. –
Frederick Cheung: estoy usando múltiples escrituras y recuperaciones. Analizaré si la indexación ayudará, pero hay muchos registros que insertar, por lo que no creo que la indexación sea útil. Hot Licks: no estoy haciendo transacciones cuando uso múltiples escrituras. ¿Debo hacer esto para cada escritura en la base de datos usando el mismo candado? – VTS12