2012-07-24 4 views
19

Mi è stato chiesto in un'intervista come possiamo impostare la dimensione massima per sqlite db per la nostra app per Android. E come possiamo gestire quando viene raggiunta la dimensione massima?Specifica la dimensione db massima sqlite per la mia app. Come gestire db full exception

MODIFICA: la risposta di Marina Lynn sotto sembra accettabile per questa domanda. Ma ci sono degli ascoltatori che vengono attivati ​​quando la dimensione del db raggiunge il limite che abbiamo specificato? (O qualcosa del genere)

+0

Cosa fare quando dimensione massima viene raggiunta non è una domanda utile, perché poi è troppo tardi. Dovresti cercare di evitare di raggiungere il limite eliminando i vecchi dati; vedi anche http://www.sqlite.org/pragma.html#pragma_auto_vacuum. –

+0

Non sono d'accordo con @CL. L'uso di SQLite come cache persistente è un caso di utilizzo legittimo della dimensione massima, quindi la domanda è utile. Durante l'inserimento di un nuovo record, lancia SQLiteFullException, in modo da poter eliminare il record più vecchio e riprovare (in un ciclo while se è necessario rimuovere diversi record per fare spazio a quello nuovo). Nota sull'implementazione: se il database è vuoto e non si riesce ancora a inserirlo, interrompere poiché il singolo record è più grande della dimensione massima. –

+1

La risposta di Marinna è sufficiente. Non hai bisogno di un "ascoltatore" qui perché l'eccezione che ottieni sarà sincrona all'operazione che stai tentando di fare. Se si includono solo le funzioni di aggiornamento/inserimento e si verifica l'eccezione. Se ti interessa il "limite" che ti viene dato, puoi sempre impostare il limite in modo che sia un po 'inferiore al limite effettivo per raggiungere questo obiettivo. Tieni presente che l'obiettivo è mantenere le dimensioni del database, non limitare l'utente o te stesso in altri modi. Oltre a ciò, un ascoltatore non sarà utile poiché potresti comunque essere ovunque nell'applicazione. – Edison

risposta

16

Innanzitutto, per impostare la dimensione massima del database utilizzare .setMaximumSize() come indicato nella risposta precedente.

In secondo luogo, Android genera SQLiteFullException se il file di database diventa più grande del numero massimo di pagine * dimensioni della pagina. SQLiteFullException è un RuntimeException. Se si desidera gestire e inviare una risposta rilevante si farà qualcosa di simile:

try { 
    getContentResolver().update(myEntity.CONTENT_URI, values, where, null); 
} catch (SQLiteFullException e) { 
    Log.w(TAG, "Exception when updating ...", e); 
} 
+0

La mia applicazione non rileva questa eccezione. Anche se sto usando sqlDB.insertOrThrow() all'interno del mio provider ..... Aiutami: /. Per favore, pubblica un esempio di contentProvider che funziona con quel} catch (SQLiteFullException e) { –

9

Sebbene non ci sia un limite alle dimensioni del database tranne per la memoria disponibile, è possibile impostare la dimensione massima a cui il database aumenterà di SQLiteDatabase.setMaximumSize(). Se raggiungi il limite devi ridurre il tuo database. Oppure puoi spostare il tuo database dalla memoria interna alla memoria esterna possibilmente con più spazio libero disponibile e aumentare la dimensione massima del database. Ma i database pesanti portano a una cattiva esperienza utente, quindi la seconda opzione considera teorica. Ricorda che siamo in un ambiente mobile non in un server di database dedicato.

+0

Grazie per la risposta, ma come posso sapere che il limite è stato raggiunto –

+1

Devi usare http://developer.android.com/reference/android/os/StatFs.html – biegleux

+0

@djaqeel Non ho mai incontrato nessun costruito negli ascoltatori. Ma puoi solo controllare la dimensione del file di database nel filesystem per avere un'idea approssimativa. Qualcosa come: nuovo file (Environment.getDataDirectory(), "data /" + context.getPackageName() + "/ databases /" + databaseName) .length, o passare quel percorso a StatFs come suggerisce biegleux. – newbyca