back to top

Creare app che interagiscono con il database (TinyDB) con MIT App Inventor

Fino a questo momento, abbiamo considerato app i cui dati non sono persistenti: ovvero rimangono in memoria soltanto durante l’esecuzione, per poi essere dimenticati. Sulla base delle informazioni prese in esame fino ad ora non sarebbe possibile, ad esempio, tenere traccia degli high scrores di un videogame oppure tenere in memoria le preferenze dell’utente circa determinati servizi.

In questa lezione vedremo, appunto, come soddisfare queste esigenze tramite una componente di MIT App Inventor che rappresenta un database.

Sono in realtà disponibili due opzioni per l’inclusione di un database tra le componenti della nostra app, queste sono:

  • TinyDB
  • TinyWebDB

Con il componente TinyDB i dati saranno salvati sulla memoria interna del dispositivo su cui la app stessa viene eseguita (ad esempio, uno smartphone), mentre nel caso di TinyWebDB i dati sono archiviati sul web e, pertanto, sono condivisibili da più dispositivi. In questa lezione sceglieremo, per semplicità, la prima opzione.

TinyDB

Grazie al componente "invisibile" TinyDB è possibile savare dati stringa mediante l’associazione a dei tags: in pratica quando si salvano dei deti gli si assegna un tag che a sua voltà verrà utilizzato per richiamare tali dati una volta salvati.

TinyDB dispone unicamente di cinque metodi, vediamoli:

  • ClearAll() – cancella tutti i dati dell’app;
  • ClearTag(tag) – cancella i dati associati allo specifico tag;
  • GetTags() – restituisce un elenco di tutti i tag presenti nel data store;
  • GetValue(tag, valueIfTagNotThere) – restituisce il valore corrispondente ad uno specifico tag o, qualora questo sia vuoto, il valore di default specificato in valueIfTagNotThere;
  • StoreValue(tag, valueToStore) – salva un dato valore (valueToStore) associandolo ad un dato tag.

Un esempio pratico di app che utilizza TinyDB

L’app che intendiamo sviluppare ha una funzionalità molto semplice: mentre è in esecuzione, se si riceve un SMS viene generata una risposta automatica. Può essere utile, ad esempio, mentre si sta guidando, per segnalare a chi ci ha cercato che richiameremo appena possibile. Il messaggio di risposta automatica viene memorizzato su un database e da lì prelevato all’avvio dell’applicazione. Tale messaggio può essere anche reimpostato, al clic dell’utente su un opportuno pulsante (componente Button).

Anche in questo caso, così come per alcune delle scorse lezioni, la scelta di questa app per impratichirsi con la componente TinyDB è suggerita dagli sviluppatori di MIT App Inventor. Creiamo per prima cosa un nuovo progetto, di nome NoTextWhileDriving (v. figura sottostante).

Creiamo un nuovo progetto di nome NoTextWhileDriving

Inseriamo ora, dalla scheda Designer, le componenti, impostandone opportunamente le proprietà. Inseriamo tre componenti visibili: una Label, una Textbox e un Button.

  • Indichiamo all’interno della Label le istruzioni per l’utente, impostando la proprietà Text con un messaggio del genere: "Imposta il testo della risposta da inviare se vengono ricevuti messaggi durante l’esecuzione di questa app";
  • Impostiamo poi la proprietà Text della componente Button a: "Modifica risposta automatica";
  • Impostiamo la proprietà Text della componente Textbox a un messaggio di risposta di default, ad esempio: "Sto guidando. Richiamo appena possibile".

Impostiamo infine la proprietà Title della componente Screen1 (che rappresenta la schermata principale della nostra app ed è inserita nel progetto per default) a "NoTextWhileDriving".

Inseriamo inoltre due componenti non visibili: Texting (per la gestione degli SMS) e, ovviamente, TinyDB. Nella figura in basso, possiamo osservare la scheda Designer della schermata principale, come risulta dopo aver eseguito le operazioni indicate.

Scheda Designer dell'applicazione NoTextWhileDriving

Passiamo ora alla scheda Blocks e ai behavior della nostra app, cominciando con lo specificare le operazioni da eseguire all’avvio.

Per prima cosa (tramite il blocco initialize global) definiamo una variabile a cui assegniamo il nome response ed un valore di default che tornerà utile qualora ci siano problemi con i passaggi successivi.

Questa variabile deve contenere il messaggio di risposta automatica, tale valore, pertanto, dovrà essere estratto dal database, tramite il metodo TinyDB1.GetValue, all’avvio della schermata principale ("When Screen1.Initialize"). Osserviamo, facendo riferimento alla figura in basso, che il messaggio viene cercato all’interno del database con lo specifico tag ResponseMessage.

Per garantire che in ogni caso tale variabile assuma un valore, dovremo definire un messaggio da assegnare in caso non sia possibile trovare il messaggio nel database (che potrebbe, ad esempio, essere ancora vuoto; il caso è gestito da "valueIfTagNotThere").

Infine assegniamo, come valore predefinito della TextBox1, il valore della nostra variabile Response.

Behavior per la gestione dell'invio della risposta automatica

Sarà nostra cura salvare, a seguito del clic dell’utente sul pulsante "Modifica risposta automatica", il contenuto della Textbox all’interno del database contrassegnandolo proprio con questo tag. Per farlo utilizzeremo il metodo TinyDB1.StoreValue, seguito dal riferimento al tag di archiviazione (ResponseMessage) e dall’indicazione del valore da scriverci dentro (valueToStore) che viene recuperato, appunto, dalla nostra TextBox.

Possiamo osservare tale comportamento nella figura sottostante:

Behavior per la memorizzazione del messaggio su TinyDB

In conclusione, dobbiamo gestire la risposta automatica. Le azioni devono essere svolte a seguito della ricezione di un SMS, quindi ci serviremo del blocco "when Texting1.MessageReceived". Eseguiremo, a seguito della ricezione del messaggio, l’azione "Texting1.SendMessage", per inviare la risposta automatica.

Per eseguire correttamente "Texting1.SendMessage" però, abbiamo bisogno di impostare il numero telefonico di destinazione ("Texting1.PhoneNumber") e il messaggio di risposta ("Texting1.Message"). Per quanto riguarda il numero di destinazione, corrisponde a quello da cui abbiamo ricevuto la chiamata: lo recuperiamo quindi per mezzo di "get number". Il testo del messaggio da inviare, invece, è contenuto nella variabile (globale) response che abbiamo definito in precedenza.

Behavior di inizializzazione
Pubblicitร