Gestire database SQLite con Adobe AIR usando Flash CS6 (prima parte)

0
Share:

Di recente, mi sono ritrovato a lavorare su un progetto AIR, nel quale avevo la necessità di memorizzare dei dati sulla macchina dell’utente. Questo lavoro, mi ha fornito il pretesto per esplorare le tecniche di dialogo con i database locali.
Già in passato mi sono occupato di database, quando ho realizzato siti web in PHP e MySQL, ma fino ad ora non avevo mai avuto modo di usare Flash per dialogare direttamente con un database. E chi come me appartene alla vecchia guardia, non potrà fare a meno di provare una certa soddisfazione nel violare questo vecchio tabù.
Facendo un piccolo passo indietro nel tempo, il dialogo diretto tra Flash e  un database era impossibile a prescindere dal tipo di destinazione. Se si pubblicava per il web era necessario usare un linguaggio server side che facesse da tramite con il database, se invece si voleva creare un applicativo che girasse in locale, bisognava ricorrere a programmi di terze parti (quali Zinc) per trasformare il filmato flash in un programma in grado di dialogare con un database. Per quanto riguarda il web,  ieri come oggi, questo limite è rimasto. Ma grazie ad AIR, quando creiamo programmi desktop o app per dispositivi mobili, il dialogo diretto è finalmente possibile.
Dopo aver spulciato la documentazione, fatto qualche prova e risolto il mio problema specifico, ho deciso di mettere online i miei appunti creando un piccolo tutorial in tre parti.

Premessa

Adobe AIR, è a tutti gli effetti un ambiente di sviluppo in grado di creare applicazioni desktop di tutto rispetto. Tra le varie funzioni disponibili, c’è la possibilità di lavorare con un database SQL locale. In altri termini, tramite un applicativo AIR possiamo creare un
database, specificare il percorso in cui è memorizzato e manipolarlo a nostro piacimento.
Per ottenere questo scopo, è sufficiente conoscere una serie di istruzioni ActionScript ed SQL piuttosto semplici. Il database usato nei progetti AIR, è il celebre database open source SQLite. A questo indirizzo è possibile trovare la documentazione ufficiale.
Si tratta di una base di dati  incorporata in un unico file che può interagire con vari linguaggi di programmazione (ad esempio C++, Python, PHP ed altri) e che si basa sulla sintassi SQL. Di conseguenza, chi ha avuto  modo di lavorare con un database, si troverà perfettamente a suo agio con SQLite. Ma anche chi dovesse essere del tutto a digiuno di istruzioni SQL non avrà grosse difficoltà. La sintassi SQL è in fondo estremamente semplice, volendo semplificare all’osso, si tratta di brevi frasi in inglese dove si ordina al database di svolgere dei compiti elementari: ad esempio, l’istruzione “CREATE TABLE IF NOT EXISTS rubrica”, ci consente di creare una tabella chiamata rubrica se non esiste. Consultando la documentazione ufficiale e qualche tutorial in giro per la rete, è possibile padroneggiare le principali regole sintattiche anche senza essere esperti in materia.
Anche se un’applicazione AIR può accedere a uno o più file di database distinti, nell’esempio del tutorial, mi limiterò a creare una piccola rubrica in grado di memorizzare e cancellare dei contatti.

Esecuzione sincrona e asincrona

Quando si crea un applicativo AIR, abbiamo due diverse modalità per eseguire le varie operazioni relative al database: sincrona e asincrona.
La modalità sincrona (forse la più diffusa nei tutorial in giro per la rete), esegue le operazioni in sequenza. Ovvero, quando diamo un’istruzione ad un database, solo dopo la sua elaborazione è possibile passare ad un’istruzione successiva. Ne consegue che – se il database deve elaborare una risposta complessa, l’applicazione attende l’avvenuta operazione prima di andare avanti. Dal punto di vista sintattico, se scegliamo la modalità sincrona, abbiamo modo di utilizzare un codice più agile e intuitivo basato su un uso intensivo dei metodi try() e catch().
La modalità asincrona, offre la possibilità di eseguire le operazioni relative al database, in contemporanea ad altre operazioni. Quindi, l’applicazione AIR, continua a lavorare anche se il database impiega del tempo per fornire una risposta. Quando si opta per l’approccio asincrono, dal punto di vista sintattico abbiamo una serie di eventi associati ai vari compiti svolti da database.  Ne consegue un codice leggermente più complesso, ma, allo stesso tempo, più rigoroso da un punto di vista organizzativo. Il tutorial di questo articolo si basa sull’uso del metodo asincrono.

Creare un database

Per poter iniziare a lavorare con un database SQLite è necessario svolgere tre operazioni preliminari:

  1. stabilire o creare in quale cartella posizionare il database tramite un oggetto File,
  2. creare un’istanza della classe SQLConnection per poter interagire con il database,
  3. aprire il database tramite il metodo openAsync(), se si usa il metodo asincrono, oppure open() se si usa quello sincrono.

Le prime due operazioni sono abbastanza intuitive: un database SQLite è costituito da un file del tipo nomedatabase.db. Per cui abbiamo la necessità di collocare questo file in un percorso della macchina locale. Il nostro programma AIR, dovrà essere in grado di trovare questo file, tutte le volte che sarà necessario interagire con il database.
Volendo, è anche possibile collocare il database nella stessa cartella in cui si trova il file Flash. In questo modo abbiamo sempre sott’occhio il file, e volendo, possiamo dare uno sguardo al suo interno tramite programmi free come SQLite datbase browser. Si tratta però, di una soluzione provvisoria che va bene solo in fase di test: quando si pubblica il file, è molto meglio definire una cartella ad hoc nella quale collocare il database.
Il terzo punto delle operazioni preliminari riguarda l’apertura del database. Prima di poter effettuare una qualsiasi operazione è sempre necessario aprire il database. Nel nostro esempio, poiché ci baseremo su un tipo di esecuzione asincrona, useremo il metodo openAsync().
Facciamo una prova al volo. Lanciamo Flash e apriamo un nuovo documento da File > Nuovo > AIR. Salviamo il file FLA in una cartella qualsiasi. Selezioniamo il primo fotogramma e dopo aver aperto il pannello Azioni scriviamo il seguente codice:

import flash.filesystem.File;
import flash.data.SQLConnection;
var dbFile:File=File.applicationDirectory.resolvePath(“testDB.db”);
var connect:SQLConnection=new SQLConnection();
connect.addEventListener(SQLEvent.OPEN,
function():void{
trace(“database aperto”)
});
connect.openAsync(dbFile);

Nelle prime due righe abbiamo importato i pacchetti necessari per poter gestire il database. Nella terza riga, abbiamo creato un oggetto File che colloca il file testDB.db nella cartella in cui si troiva la nostra applicazione.
La quarta riga di codice creiamo un oggetto connect per poter gestire la connessione con il database.
Nella quinta riga associamo al verificarsi dell’evento  SQLEvent.OPEN (ovvero al verificarsi della connessione con il database)  una funzione implicita che stampa il messaggio “database aperto”.
Infine, nell’ultima riga di codice, usiamo il metodo  openAsync() per aprire una connessione di tipo asincrona con il database testDB.db.
Se esportiamo il nell’ambiente di prova da Controllo > Prova filmato, otterremo nella finestra Output la stringa: “database aperto”.  Inoltre, se andiamo ad osservare la cartella nel quale abbiamo creato il file Flash, noteremo che, dopo aver testato il filmato, è apparso il file testDB.db. In teoria potremmo continuare ad usare questo percorso per interagire con il database. Ma questo dialogo è possibile solo nell’ambiente di prova: per poter pubblicare il nostro applicativo, è necessario utilizzare un percorso dedicato nel quale memorizzare il file DB. In altre parole, è preferibile usare l’oggetto applicationStorageDirectory, per specificare la creazione di una directory riservata ai dati usati da AIR. Talle cartella dedicata, ci consente di salvare il file senza problemi durante la pubblicazione finale. Per cui, il codice diventa:

import flash.filesystem.File;
import flash.data.SQLConnection;
var folder:File = File.applicationStorageDirectory.resolvePath(“dati”);
folder.createDirectory();
var dbFile:File=folder.resolvePath(“DBesempio.db”);
var connect:SQLConnection=new SQLConnection();
connect.addEventListener(SQLEvent.OPEN,
function():void{
trace(“database aperto”,dbFile.nativePath);
});
connect.openAsync(dbFile);

In questo caso, oltre a specificare un percorso diverso, abbiamo usato il metodo trace per visiualizzare anche la posizione del file. Chiaramente, il percorso restituito cambia in base al sistema operativo. Nel prossimo post entreremo nel vivo passando all’interfaccia della rubrica.

Share:

Leave a reply

*