Usare SQLite su iPhone SDK significa divertirsi con il C. Se non si ha pero’ bisogno guardare alle performance come un fattore critico (e quindi nel 90% dei casi) è possibile ricorrere ad uno dei diversi wrapper objective-c che si trovano in rete. FMDB è uno di questi e si caratterizza per l’estrema semplicità e velocità nell’uso.
Utilizzando FMDB mi è capitato di dover agire su uno stesso DB da più thread differenti. Se si ha una sola istanza aperta del db (la normalità) è possibile eseguire un solo statement alla volta: l’autore del progetto si è infatti preoccupato di munire le funzioni degli appositi lock che permettano di mantenere coerenza sulla struttura dati. Il problema è ovviamente quello di poter eseguire una sola azione senza concorrenza di accesso: tutte le richieste fatte quando già un thread è al lavoro sull’istanza di FMDatabase vengono sistematicamente ignorate.
Se non si è interessati all’ordine di esecuzione delle operazioni è possibile risolvere il problema facilmente modificando qualche riga dei sorgenti. In particolare agiamo su tutte le occorrenze di:
if (inUse) { [self compainAboutInUse]; return NO; }
Sostituendole con:
while (inUse) { usleep(50); }
In questo modo l’esecuzione dello statement proveniente da un altro thread si mette in pausa per 50 millisecondi fintanto che il db non è pronto a ricevere una nuova azione.
Ovviamente non abbiamo realizzato una vera e propria concorrenza ma è comunque un modo rapido per non affrontare soluzioni più complicate.