Nel metodo onCreate()
della mia attività principale chiamo il costruttore del mio dbManager, chiamo la funzione open che crea un'istanza di SQLiteOpenHelper
e chiamo su di esso lo getWritableDatabase()
. All'interno di UIThread aggiungo record al database e li salva in ArrayList. Altri due thread controllano la roba di ArrayList e aggiornano la lista e il database. Ora voglio aggiungere un pulsante nell'interfaccia utente per eliminare sia il database che i record degli elenchi utilizzando uno AsyncTask
. Ho letto che l'oggetto SqliteOpenHelper
contiene una connessione al database. Quindi se c'è un'istanza di helper c'è solo una connessione db. Questa connessione può essere utilizzata da più thread e l'oggetto SqliteDatabase utilizza i blocchi java per mantenere la serializzazione dell'accesso. Quindi, se ho più thread che scrivono sul database, un thread attenderà che il precedente abbia completato la sua operazione?
L'aggiunta della nuova funzionalità (rimuovere tutto) potrebbe creare problemi, poiché devo evitare che uno dei due thread possa provare a modificare un record che non esiste più. Come posso raggiungere il mio obiettivo? Grazie.Android: thread multipli che scrivono sul database SQLite
risposta
Il databese:
Finché si utilizza un solo aiutante, si sono sicuro, senza la necessità di fare qualcosa thread.
In un'app multi-thread, è necessario synchronized
solo per la creazione dell'helper. È possibile utilizzare transacion se si desidera definire una sezione critica (più di un'operazione atomica).
Avvolgere ogni chiamata con getWritableDatabase()
e close(false)
:
public void doSomething() {
SQLiteDatabase tdb = getWritableDatabase();
dbInstance.writeSomething(tdb, 1);
close(false);
}
In questo modo ho più thread lettura e la scrittura nel database senza alcun problema.
È la logica app:
Usa memoria per tenere traccia di stato di un oggetto, e utilizzare il database come unica stoccaggio. Quindi, se un thread cancella le righe dal database, puoi immediatamente aggiornare gli oggetti in memoria e gestire il tuo ui di conseguenza.
Se i tuoi dati sono molto grandi, puoi tenere in memoria solo un SparseArray
di id di righe sporche.
Potrebbe essere utile sincronizzare alcune operazioni qui.
Dove si trova la sincronizzazione nel tuo pezzo di codice? – IamStalker
L'helper del database sta eseguendo tutta la sincronizzazione necessaria per mantenere l'integrità del database. E non correlato al db - nella logica dell'app, potrebbe essere necessario che lo sviluppatore si sincronizzi attorno alle sezioni critiche del codice per mantenere l'integrità della logica aziendale. – auval
Non esiste una tale limitazione, un centinaio di thread possono leggere e scrivere insieme nello stesso DB senza alcun problema. Usando un aiutante. Questo * non * dove si trova il problema quando si scrive un'app multi-thread. – auval
Quindi, se ho più thread di scrittura sul database, un filo sarà attendere che la precedente ha terminato la sua operazione?
Non è necessario. Vedi this per maggiori dettagli. Ad ogni modo, questo dipende dal motore DB e dovrebbe essere trasparente.
Aggiunta la nuova funzionalità (rimuovere tutti) potrebbe creare problemi, perché devo evitare che uno dei due fili può tentare di modificare un record che non esiste più. Come posso raggiungere il mio obiettivo?
Hanno solo un thread aggiornare il DB. Altri thread modificano solo lo ArrayList
-anche lo si deve verificare perché ArrayList
non è thread-safe, si consideri l'utilizzo di Collections#synchronizedList()
.
- 1. I thread multipli SBCL scrivono sull'uscita standard
- 2. thread multipli che scrivono su std :: cout o std :: cerr
- 3. synchronize database sqlite Android
- 4. Android: SQLite che utilizza database errato
- 5. Android - SQLite ContentResolver inserisce/elimina/aggiorna sul thread UI?
- 6. Visualizza database SQLite sul dispositivo in Android Studio
- 7. Database di ricerca Android Android sul telefono
- 8. Schema del database Sqlite Android
- 9. Crea database SQLite in Android
- 10. Analizzare JSON e salvarli sul database SQLite
- 11. ipdb, thread multipli e programmi di autoroading che causano ProgrammingError
- 12. aggiornamento del database SQLite che copio dalla cartella attivi (Android)
- 13. Database multipli in una singola app in Android
- 14. Che cos'è il database SQLite "-journal" in Android?
- 15. Come si scrivono le uscite sul log in Android?
- 16. Memorizzazione di valuta nel database Android SQlite
- 17. Android - Accesso al database online SQlite
- 18. Flushing e database SQLite su Android
- 19. Informazioni sul campo "_id" in Android SQLite
- 20. Database SQLite Android condiviso tra le attività
- 21. H2 Database vs SQLite su Android
- 22. Aggiornamento database SQLite Android e app
- 23. Perché utilizzare il database sqlite in Android?
- 24. Sqlite Database LEAK FOUND exception in android?
- 25. Come trasformare un database MSSQL nel database SQLite per Android
- 26. sqlite database connection/locking question
- 27. Contemporanea sqlite Android senza eccezioni
- 28. Accesso multithread Android SQlite
- 29. Fluent NHibernate + database multipli
- 30. Loopback + Connetti database multipli
È necessario implementare il modello consumer e producer, questo aiuterà a creare una coda di richieste, non scrivere parallelamente al database. – IamStalker
dipende da come si implementa la modifica, ma un aggiornamento sql restituisce n, dove n è il numero di elementi modificati, che può essere totalmente 0 se non esiste alcun record corrispondente alla clausola where. – njzk2
1) Non si dovrebbero eseguire operazioni DB su Thread UI. 2) Avere solo un thread per leggere/scrivere l'ArrayList. @IamStalker perché non scrivere in parallelo al DB? – m0skit0