2013-03-11 2 views
5

La mia domanda riguarda le buone pratiche di gestione delle eccezioni DB.Android: come devo gestire le eccezioni di accesso ai DB?

Diciamo che ho un'applicazione che memorizza alcuni dati nel DB. Sono implementati i seguenti livelli:

  1. DatabaseAdapter - gestisce le query SQL e fornisce dati al livello superiore in forma di modello. Adattatore contiene un metodi come:
    • Lista GetAllUsers()
    • vuoto adduser (utente UserModel)
  2. UserListActivity - mostra la lista di tutti gli utenti, permette di aggiungere un nuovo utente, ecc Questa attività utilizza DatabaseAdapter leggere/scrivere il database.

La domanda è: devo gestire un'eccezione dell'accesso al database, ad esempio quando aggiungo un nuovo record (supponendo che il record debba sempre essere aggiunto correttamente)? Devo solo provare a catturare l'eccezione in DatabaseAdapter e aggiungerla al log? O forse non dovrei prenderlo affatto?

risposta

4

La maggior parte delle volte, un'eccezione quando si esegue una query su un database è il risultato di un errore di "sviluppo", come una query malformata, o della modifica dello schema ma non dell'incremento della versione del database o qualcosa del genere. Questi saranno abbastanza facili da trovare e risolvere direttamente sul posto, quindi i tuoi utenti finali non saranno colpiti da questi tipi di errori.

Tuttavia, ci sono anche reali possibilità che si possono avere eccezioni nei seguenti casi:

  • Si tenta di accedere al database SQLite da più processi (una ricetta per il disastro).
  • L'utente esaurisce lo spazio su disco sul proprio dispositivo.
  • Si dispone di una query non valida a causa dell'esclusione corretta dell'inserimento dell'utente.
  • C'è un bug nel tuo metodo onUpgrade() o qualcosa del genere.
  • Si sta utilizzando l'integrità referenziale (possibile in SQLite 3.6.19 e versioni successive) e alcuni vincoli di tabella non riescono.

In realtà, non esiste una risposta universale per questi scenari. Per l'utente finale, mostrare un semplice errore è molto più bello che avere la forza dell'app vicino, ad esempio.

La mia regola generale è di evitare la corruzione del database a tutti i costi. Preferirei piuttosto lanciare un RuntimeException e uccidere immediatamente l'app piuttosto che fare silenziosamente qualcosa di sbagliato. Inoltre, preferirei mostrare un messaggio che dice che un inserto non può essere completato piuttosto che forzare la chiusura dell'app.

0

Non esiste una risposta comune a questa domanda che si adatta sempre. Dipende dal caso d'uso. Si applicano sempre due regole: non passare messaggi di eccezione troppo dettagliati al livello precedente (l'UI non ha bisogno di conoscere un problema nella sintassi SQL) e gestire l'eccezione dove ha senso (non mostra una finestra di errore nella tua classe DB). Ad esempio, è possibile rilevare l'eccezione del database nella classe DB, registrarla e quindi lanciare un'eccezione personalizzata CustomerNotFoundException che viene catturata nell'interfaccia utente in cui è possibile visualizzare una finestra di dialogo di errore.