Il thread dell’istanza del database Sqlite è sicuro

Ho un database con alcune tabelle. Voglio aggiornare le tabelle utilizzando più thread. Userò la stessa istanza di SQLiteDatabase in tutti i thread.

Si prega di suggerire se questo approccio è corretto. Il database Sqlite è thread-safe? Due thread diversi possono aggiornare la stessa tabella per diversi set di valori contemporaneamente.

    [WRONG:] No, non è thread-safe per impostazione predefinita. Utilizzare i metodi SQLiteHelper relativi al blocco per garantire la sicurezza dei thread.

    [EDIT]: la class SQLiteDatabase fornisce un meccanismo di blocco per impostazione predefinita (vedere i commenti) e, se si sta eseguendo il multithread, non è necessario modificare nulla per garantire la sicurezza dei thread.

    Cerca “thread” in questo documento: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

    E leggi di più su:

    Android utilizza il meccanismo di blocco java per mantenere serializzato l’accesso al database SQLite. Quindi, se più thread hanno una istanza di db, chiama sempre al database in modo serializzato e, naturalmente, il database è thread-safe .

    Se confermiamo che stiamo usando il database dal singolo thread abbiamo avuto l’opzione di disabilitare il blocco interno del database chiamando setLockingEnable(false) ma questo metodo è stato deprecato dal livello API 16 e non è più in uso. se vedi l’implementazione di questo metodo nella class SQLiteDatabase , non troverai nulla di scritto lì, vale a dire un metodo vuoto.

     public void setLockingEnabled (boolean lockingEnabled) 

    Questo metodo ora non fa nulla. Non usare.

    Una cosa di cui dovremmo occuparci è che dovremmo creare un’istanza della class helper (cioè renderla singleton) e condividere la stessa istanza su thread multipli e non chiamare close() sul database tra un’operazione, altrimenti potresti ottenere seguente eccezione:

    java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase

    Quindi, non chiamare database.close() tra l’accesso al database, il database eseguirà automaticamente l’operazione di chiusura internamente quando tutte le operazioni verrebbero concluse.

    Puoi controllare se il tuo database è sicuro o meno da setLockingEnabled .

    Controlla se SQLiteDatabase è protetto o meno da thread utilizzando i blocchi attorno alle sezioni critiche. Questo è piuttosto costoso, quindi se sai che il tuo DB verrà usato solo da un singolo thread, dovresti impostarlo su false. Il valore predefinito è true

    Quindi penso che questo risponda alla tua domanda.

    Il metodo setLockingEnabled è ammortizzato nel livello API 16

    Se ce la fai ..

    setLockingEnabled (boolean lockingEnabled) Controlla se SQLiteDatabase è protetto o meno da thread usando le serrature attorno alle sezioni critiche.