2010-07-13 24 views
9

Ho un'applicazione Android che utilizza un database SQLite. Apro il database all'avvio dell'applicazione, ma non lo chiudo mai poiché è in uso costante.Flushing e database SQLite su Android

Qual è il modo migliore per dire al database di scaricare tutte le sue modifiche nella memoria permanente? Devo semplicemente chiuderlo e riaprirlo o esiste un modo più efficiente?

Il mio problema è che quando si esegue il test su un telefono, spegnendo il telefono dopo un certo numero di scritture a volte il database perde gli aggiornamenti più recenti quando l'applicazione viene riavviata, il che è ovviamente inaccettabile per un sistema di database.

Poiché non riesco a scoprire come acquisire l'evento di chiusura dell'applicazione, non posso sapere quando chiudere manualmente il database.

risposta

8

Apre il database all'avvio dell'applicazione, ma non lo chiudo mai poiché è in uso costante.

Non farlo. Apparentemente ignorerai tutti gli errori che appaiono in LogCat lamentando il fatto che stai perdendo connessioni al database.

Qual è il modo migliore per raccontare il database per irrigare tutte le sue modifiche al memorizzazione permanente?

It will do that automatically at the end of a transaction. Per impostazione predefinita, ogni singola operazione SQL (ad esempio, inserimento) è una transazione.

Devo chiuderlo e riaprire oppure esiste un modo più efficiente?

È necessario chiudere il database a un certo punto (ad esempio, onDestroy() del servizio che sta mediando il database).

mio problema è che quando si verifica su un telefono , spegnere il telefono cellulare dopo un certo numero di scritture a volte causa il database sciogliere le più recenti aggiornamenti quando l'applicazione viene riavviato, che è ovviamente inaccettabile per un sistema di database.

Se è possibile creare un progetto di esempio che illustra il problema anche dopo che si sta chiudendo correttamente la connessione al database, post-it al Android issue tracker.

Dal momento che non riesco a trovare il modo di catturare l'applicazione evento close Non posso sapere quando chiudere manualmente il database .

Chiuderlo quando tutte le attività si sono disconnesse dal servizio che sta mediando la connessione al database, attivando il metodo onDestroy() del servizio.

Oppure, aprire una nuova connessione in ciascun componente che richiede l'accesso al database e utilizzare la sincronizzazione Java per assicurarsi che due thread non provino a utilizzare contemporaneamente il database (se necessario).

+3

Un'applicazione non deve utilizzare il servizio di mediazione per utilizzare un database SQLite e un'applicazione Android non viene avvisata quando è chiusa, quindi la risposta sopra non è terribilmente utile. –

-1

È su un Droid? E come spegnete esattamente il telefono? A meno che non si estrae la batteria, spegnendo il telefono si arresta lentamente il sistema operativo, a quel punto si impegnerà tutto in memoria.

Quando si perde esattamente il database? Dopo ogni riavvio dell'app, o solo in modo casuale? Se è dopo ogni riavvio, sembra più che stai distruggendo il database all'avvio.

+0

Dopo un riavvio, le informazioni perse in modo incoerente. All'avvio del dispositivo, apro semplicemente il contenuto del database e talvolta solo alcune informazioni ci sono. Perché il dispositivo dovrebbe impegnare tutto su disco? Se il sistema operativo uccide il programma senza chiamare su Terminal (che l'SDK dice che è perfettamente valido e che si prevede di fare) devo chiudere/riaprire il database dopo ogni scrittura? – Akusete

+1

A meno che non si uccida un'app (con un sigterm o rimuovendo la batteria), si spegnerà sempre in modo pulito. Guarda il codice sorgente per tutte le app Android come l'app di messaggistica: tutti utilizzano un fornitore di contenuti che apre un database ma non lo chiude mai. Lasciano al sistema operativo per terminare il processo, a quel punto si pulirà. (hackbod ne ha parlato in un post da qualche parte). Non ci dovrebbero essere motivi per svuotare nulla. Puoi pubblicare un codice su come creare/gestire il tuo database? – EboMike

1

Se si utilizzano transazioni, esse sono nidificate. Significa se si esce da uno prima di terminarlo. Alla fine, quando si riavvia il telefono/l'app, si arresteranno alcune scritture poiché non si chiude mai la connessione.

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 
Problemi correlati