android-db

SQLite Asset Helper: gestire grossi database con Android

Roberto Orgiu -

In un precedente articolo, avevamo affrontato la problematica della creazione dei database sul nostro dispositivo, ma non sempre è una decisione saggia lasciare ad Android questo compito: cosa accadrebbe se avessimo bisogno di un database enorme? La soluzione migliore sarebbe di utilizzarne uno esterno, creato in precedenza, ma potremmo incontrare alcune difficoltà.

Qualora optassimo per questa scelta, saremmo praticamente obbligati ad utilizzare gli asset, una particolare categoria di risorse di un’applicazione Android che ci permette di caricare i file più diversi e usarli nei nostri programmi, comprimendoli in modo da non creare un APK di dimensioni colossali: è proprio quello il punto focale, in quanto non siamo sicuri dei meccanismi di compressione scelti dal compilatore al momento della creazione del file e potremmo trovarci nella situazione in cui abbiamo un archivio corrotto e non sappiamo come utilizzarlo, senza contare il fatto che per le versioni di Android precedenti a Gingerbread, la dimensione per i singoli elementi nella cartella assets era di 1MB, quindi avremmo dovuto spezzare (manualmente) e poi ricomporre (da codice) i nostri dati.

Ed è proprio per evitare questa problematica che uno sviluppatore ha rilasciato su Github una libreria che ci permette di utilizzare database di grosse dimensioni senza praticamente preoccuparci del codice, in quanto sarà praticamente uguale a quello che abbiamo utilizzato nel precedente articolo. Per prima cosa scarichiamo il file della libreria e scompattiamolo, creiamo un nuovo progetto Android e andiamo nella directory in cui abbiamo salvato il progetto, creando nella root dello stesso una cartella libs in cui copiamo il file appena scaricato.

A questo punto, possiamo tornare su Eclipse e aggiornare il nostro progetto, cliccandoci sopra con il tasto sinistro del mouse e schiacciando poi F5. Ora dobbiamo solamente includere la libreria nel percorso di costruzione della nostra applicazione e lo facciamo andando a cliccare con il tasto destro sulla voce del progetto, spostandoci su Build Path e successivamente su Configure Build Path.

 

Nella finestra che ci si presenta, clicchiamo su Add JARs e andiamo poi a selezionare, nel nostro progetto, sotto la cartella libs, il file android-sqlite-asset-helper.jar e clicchiamo due volte sui bottoni OK. A questo punto, il nostro progetto è configurato e possiamo iniziare a creare il nostro database.

La creazione del database è semplice, in quanto dobbiamo solamente rispettare alcune regole:

  1. il nome del file ZIP contenente il file SQLite dev’essere lo stesso che poi diamo al database dentro la nostra applicazione (possiamo usare qualsiasi livello di compressione)
  2. dentro il file ZIP, l’unico file dev’essere il nostro database, che può avere qualsiasi nome.
  3. inserire l’archivio dentro una cartella assets/databases (dovremo creare quest’ultima)

Per il nostro esempio, abbiamo chiamato il file wordlist, e appare così

A questo punto, anche il database è pronto e possiamo andare a scrivere le pochissime linee di codice che ci servono per inizializzare la libreria, iniziando con il creare la classe che servirà come helper, estendendo la nostra libreria SQLiteAssetHelper, diversamente da come avevamo fatto nel precedente articolo:

public class AssetDatabase extends SQLiteAssetHelper{

public AssetDatabase(Context context) {
super(context, C.DB_NAME, null, C.DB_VERSION);
}

}

Dove le due costanti sono dichiarate in questa maniera:

public static final String DB_NAME = “wordlist”;
public static final int DB_VERSION = 1;

E se volessimo aggiornare il database? Basterebbe semplicemente incrementare il numero di versione e inserire il file SQL dell’aggiornamento (una serie di query e istruzioni in linguaggio SQL) nella cartella assets/databases, rinominandolo nel seguente modo

<nome database>_upgrade_<versione iniziale>-<versione finale>.sql

che, nel nostro caso specifico, diventerebbe

wordlist_upgrade_1-2.sql

e la libreria si occupa in automatico di aggiornare il nostro database senza perdere nessun dato memorizzato sopra (a meno che non decidiamo noi di farlo nel file SQL). Come di consueto, potrete trovare nel nostro forum il link all’articolo, alla libreria e ad alcuni esempi.