Cerca con Google

Translate

31 luglio 2013

Tutorial 53 - Il componente TinyDB per il salvataggio dei dati (App rubrica telefonica)


Torniamo a parlare di TinyDB, un componente veramente fondamentale in Android App Inventor.

Abbiamo già visto il componente nel Tutorial 23 , oggi vedremo un altro esempio andando a realizzare una semplice rubrica telefonica dove l'utente potrà memorizzare in maniera persistente un elenco di record composto da:

Nome - Cognome - Numero di Telefono

Questo elenco sarà memorizzato nel telefono e quindi lo potremo ricaricare a piacimento anche dopo che l'utente ha riavviato l'applicazione o il telefono.
Il tutorial di oggi è interessante perchè mostra oltre al componente TinyDb anche l'utilizzo delle funzioni:
- add item to list
e del ciclo di controllo
- foreach
che non erano state viste nel tutorial precedente.

Ma partiamo con ordine e vediamo cosa può fare il componente TinyDB, questi che vedete sulla destra sono i suoi metodi:

Il suo utilizzo è molto semplice, prima si memorizza un dato (o dei dati) richiamando il metodo
TinyDB1.StoreValue
dove il tag è il nome che vogliamo assegnare al nostro dato e valueToStore contiene il dato (o i dati) che vogliamo salvare.

Per leggere i dati dal TinyDB usiamo invece il metodo
TinyDB1.GetValue
a cui passiamo l'unico valore tag.

Per fare un semplice esempio con un solo dato, supponiamo di voler salvare un numero di telefono, potremmo farlo con
TinyDB1.Storevalue tag=NumeroTel valueToStore=02-555555
e per leggere questo numero l'operazione da fare sarà (dopo aver creato una label o una variabile dove memorizzare il dato letto)
TinyDB1.GetValue tag=NumeroTel

Nell'esempio del video invece memorizzeremo nel TinyDb una semplice rubrica telefonica creando tramite il comando "make a list" un lista bidimensionale dove ogni elemento sarà composto dalla tripletta di valori
(nome cognome numero)
Ad ogni inserimento di un nuovo record (ovvero dei 3 valori) aggiungeremo questi alla lista caricata in memoria andando così a creare una lista bidimensionale (ArrayList) con la nostra rubrica.

Esempio di Lista monodimensionale e bidimensionale
Per farvi capire meglio la struttura dati utilizzata nel TinyDb guardate l'immagine qui sopra, ogni riga sarà un elemento della liste ed ognuno di questi elementi avrà a sua volta ulteriori tre elementi (nome - cognome - numero di telefono).
Di fatto genereremo quindi una lista bidimensionale con dimensione (sempre riferita al disegno) m pari al numero di valori inseriti dall'utente e con n sempre uguale a 3 (nome - cognome - telefono)

Avremo inoltre dei pulsanti SalvaDB per effettuare la memorizzazione vera e propria della lista, un pulsante CaricaDB per caricare tutto quello che è eventualmente salvato nel TinyDB ed un pulsante CancellaDB per cancellare tutto quello contenuto nel TinyDB.

Un altro elemento fondamentale per lavorare sulle liste (e quindi in questo caso anche sui dati che abbiamo salvato nel TinyDB) lo troviamo nella palette "control" e si chiama

foreach

questo componente "scandaglia" ogni elemento della lista che gli viene passata nel parametro "in list" e restituisce il valore corrente dell'elemento analizzato nella variabile (variable)

Nell'esempio del video abbiamo tutta la nostra rubrica caricata nella variabile (che in questo caso è una lista bidimensionale) chiamata "DB_Rubrica"; supponiamo ci siano due record memorizzati, questi saranno ad esempio

((mario rossi 02-5555) (giovanni bianchi 06-33333))

il controllo (ciclo) foreach viene quindi eseguito due volte, la prima volta la variabile "DB_RubricaElement" avrà il valore (mario rossi 02-5555), la seconda volta il valore (giovanni bianchi 06-33333).
In pratica avremo quindi un accesso semplice e veloce a tutti gli elementi della nostra lista, questo ci apre le porte un pò a tutto, nel video infatti mostro come stampare a video tutto l'elenco telefonico memorizzato, in un prossimo video mostrerò come effettuare una ricerca all'interno della nostra rubrica, sempre usando il ciclo "foreach".

Potete scaricare il sorgente di questo tutorial cliccando QUA

Dopo la visione del video tornate qui e leggetevi l'help completo sempre tradotto da me del componente TinyDB!!!
Buona visione!!!


TinyDB
Si usa per memorizzare dei dati che saranno disponibili ad ogni esecuzione dell'applicazione.
TinyDB è un componente non visibile.
Le app create con App Inventor vengono inizializzate ogni volta che vengono eseguite. Se un'applicazione memorizza il valore di una variabile e l'utente quindi chiude l'applicazione, il valore di tale variabile non sarà memorizzato ed alla prossima esecuzione dell'app il valore sarà perso. TinyDB è un archivio dati persistente per l'applicazione, ovvero i dati salvati saranno disponibili ogni volta che si esegue l'applicazione. Un esempio potrebbe essere un gioco che ha salvato il punteggio più alto, e carica questo dato ogni volta che il gioco è eseguito.
I dati vengono memorizzati usando i tag. Per memorizzare un dato, si specifica il nome del tag. Successivamente, è possibile recuperare il dato che è stato memorizzato con un determinato tag. Se non vi è alcun valore memorizzato in una variabile, allora il valore restituito è il un testo vuoto. Di conseguenza, per vedere se un tag ha un valore memorizzato in esso si può controllare se il valore restituito è una stringa vuota.

C'è solo un archivio TinyDb per ogni app. Quindi se si mettono più componenti TinyDB, questi useranno lo stesso archivio dati. Per salvare dati diversi quindi bisogna utilizzare nomi di tag diversi. Inoltre, ogni applicazione ha il suo archivio TinyDb. Non è possibile utilizzare TinyDB per passare dati tra due applicazioni diverse sul telefono.

Properties

nessuna

Events

nessuno

Methods

StoreValue(text tag, valueToStore)
Memorizza il valore "valueToStore" nel "tag" relativo. Il "tag" deve essere una stringa di testo, il valore da salvare può essere una stringa di testo o una lista.

GetValue(text tag)
Legge il valore che è stato memorizzato sotto il "tag" specificato.
Se non c'è nessun valore, questo metodo ritorna un testo vuoto.
Nota: Per cancellare i dati memorizzati nel TinyDb, andate in impostazioni del telefono, Applicazioni scegliete la vostra applicazione e poi "Cancella Dati"
I dati nel TinyDB sono memorizzati solo se l'app è stata scaricata come apk sul telefono. Se si sviluppa col telefono collegato al blocks editor e si fa ripartire App Inventor companion oppure se si disconnette e riconnette il telefono i dati vengono persi.
Questo perchè di fatto quando si lavora col blocks editor collegato, ad ogni reset della connessione l'app viene rimossa e poi reinstallata nel telefono.







22 commenti:

  1. Ciao, grazie mille per i tutorial =) Volevo chiederti una cosa...cioè nel caso io volessi andare a cancellare un nome nella rubrica o a modificarlo se mi accorgo di un errore...posso farlo con TinyDB? e nel caso come potrei fare?
    Grazie mille

    RispondiElimina
    Risposte
    1. Diciamo che il discorso non è legato direttamente al TinyDB ma da come organizzi la tua lista bidimensionale,
      forse la cosa più semplice è usare il "replace list item"
      http://appinventor.mit.edu/explore/content/list-blocks.html#replace list item
      devi ovviamente prima individuare l'indice del tuo elemento che vuoi modificare, poi una volta che lo hai trovato (magari facendo un search nella tua list per trovare in che posizione si trova)
      usi il replace, devi dargli in "list" la tua lista completa , in "index" l'indice con la posizione dell'elemento che vuoi sostituire e in "replacement" ovviamente il nuovo dato.

      Poi quando hai la tua lista bidimensionale aggiornata e corretta la salvi nuovamente nel TinyDB.
      Ti consiglio di usare tante finestre di watch per vedere bene come funziona il tutto ed essere sicuro che le operazioni che fai sono corrette :)

      Elimina
    2. Per cancellare un elemento hai la funzione "remove list item" che funziona in maniera simile.
      occhio che nell'esempio pubblicato dovresti lavorare sull'indice "m" ovvero quello che contiene in ogni dato la tripletta dei valori.

      Elimina
  2. Si possono mettere foto nel Data base ci sono campi immagine?

    RispondiElimina
    Risposte
    1. no, però puoi mettere degli URL con l'indirizzo della foto,
      carichi l'URL in forma testuale ed imposti la proprietà picture per caricare l'immagine nella tua app

      Elimina
  3. Guida molto dettagliata sia nell'articolo che nel video tutorial.
    Vorrei porre un quesito: Il salvataggio fatto nel video crea un array anche se da come è gestito il salvataggio all'interno dell'array si crea un arraylist ma bisogna ricordarsi in fase di lettura che sono tutti array da 3 variabili, comunque non sarebbe meglio salvare i dati dando come tag il numero di telefono oppure un numero che verrà incrementato di volta in volta cosi da creare una specie di database. Detto ciò questo favorirebbe la velocità di lettura delle informazioni e con ciò la velocità dell'app? Anche perché ho notato che in ai2 si possono inserire più di un tyniDB ma non sò se sono realmente due storage separati o non so cosa

    RispondiElimina
    Risposte
    1. La tua considerazione è giusta, questo è solo un esempio e non è certamente ottimizzato al massimo.
      Si potrebbe inserire come primo valore un ID univoco ed avere quindi un array da 4 elementi.
      Non credo però che la velocità di lettura e scrittura migliori (da quel che ho capito io sul funzionamento del TinyDB)
      Anche in AI1 puoi mettere più di un TinyDB anche se poi in realtà il file su cui legge/scrive è sempre lo stesso quindi di fatto è inutile inserirne più di uno, tanto abbiamo infiniti "tag" da poter usare e volendo in ogni "tag" possiamo memorizzare un db separato.

      Elimina
    2. Buonasera a tutti,
      Vorrei sapere se è possibile poter copiare il file che viene generato da TyniDB per una copia di sicurezza in caso di guasto del telefono e in tal caso come si trova il file
      Grazie

      Elimina
  4. Ciao Seba...Grazie dei tuoi tutorial sono straordinari li rivedo e li rivedo :) sei molto semplice nell'insegnare complimenti quando organizzi una lezione live? magari su skype?

    volevo farti una domandina semplice semplice sulle celle bidimensionali come faccio a dividerle nel label dei risultati visualizzati?
    o meglio mi spiego io carico i dati da un tinywebdb che in origine sono tre celle Textbox(nel caso mio PRODOTTO-TIPOLOGIA-PREZZO) ma quando lo visualizzo si lo carico ma sono tutti e tre insieme ma poi diventano uno con il Label... mi spiego meglio se non sono stato chiaro

    TextboxProdotto-TextboxTipologia-TextPrezzo = Label risultato (ovviamente tutti e tre insieme)

    io invece volevo avere come risultato dopo il caricamento

    TextboxProdotto-TextboxTipologia-TextPrezzo = Label Prodotto tipologia -label Prezzo

    ecco il link del Blocks Editor della mia App

    https://drive.google.com/file/d/0BxngC48G-rM4UVYtaDNTcVlwTUk/edit?usp=sharing

    scusa se sono stato lungo :P ma era per essere chiaro :) e qui in Sicilia si Parla CHIARI hiihihih

    RispondiElimina
    Risposte
    1. Ciao Antonio, innanzitutto considera che il TinyWebDB salva i dati sempre in formato JSON, quindi sempre sottoforma di coppia tag-valori
      Ora io non conosco il tuo formato di salvataggio nel TinyWebDB quindi mi potrei anche sbagliare...
      Ad ogni modo vedendo l'immagine mi sa che hai fatto un pò di confusione con i "tag" ed i "value"
      O imposti il tuo programma con tre tag distinti (prodotto, tipologia, prezzo) e quindi ad ogni salvataggio esegui 3 store value con questi 3 tag
      Oppure imposti un unico Tag e ci salvi al suo interno una lista di valori (creata con Make a List)
      Per non perdere i valori precedenti devi sempre usare il MakeaList perchè immagino tu voglia creare un elenco di prodotti, quindi poi dovrai agire sui dati con il selectlistitem o foreachiteminlist
      Un altra possibile soluzione potrebbe essere quella di creare un record con un tag diverso per ogni entry nel tuo database, quindi ad esempio salvando i dati come:
      Dato1 = Prodotto1,Tipologia1,Prezzo1
      Dato2 = Prodotto2,Tipologia2,Prezzo2, etc...
      il problema è che in questo caso non sai a priori la lunghezza dei tuoi dati (ovvero non sai quanti tag hai nel DB e dovresti andare a "tentativi" con un ciclo while finchè il tuo TinyWebDb non ti ritorna che il tag non è esistente)
      Per l'estrazione delle label in maniera separata, anche qui dipende tutto da come hai salvato i dati, se usi l'ultimo approccio basta che usi "ListFromCSVRow" per creare una lista di 3 elementi ad ogni lettura di un rigo dei tuoi dati, poi con select list item ed indice (1,2,3) prendi le tue 3 label.
      Spero di essere stato chiaro, non è semplice spiegare queste cose e credo che il miglior modo sia per te quello di sperimentare le varie soluzioni e vedere quella più adatta alle tue necessità.
      Considera anche le FusionTables (non ho ancora fatto tutorial a riguardo ma trovi molte info sul sito ufficiale (in inglese ovviamente))

      Elimina
    2. Caro seba :) hihiihih mi sento un pò in imbarazzo ma la situazione e la seguente vorrei fare un app capace di ricercare il prodotto richiesto dal file csv (prodotti in "spreadsheet") ed esportarli in un'app cosi da dividere in tre "label" prodotto tipologia prezzo...in modo d'avere un indice chiaro e tutto limpido.

      cosa mi consigli?

      Elimina
    3. Se i tuoi dati sono online, per esempio in un foglio di lavoro Google (soluzione ottimale) allora puoi fare come in questo tutorial:
      http://seblogapps.blogspot.it/2012/11/tutorial-38-importare-dati-da-una.html
      saltando la parte dell'importHTML visto che te hai già i dati in csv pronti
      Poi tramite varie Select (con linguaggio SQL) prendi i dati che ti servono e li memorizzi in delle liste separate, una per ogni label.
      Altrimenti se il tuo file .csv è fisso e non cambia , lo puoi caricare con questo tutorial:
      http://seblogapps.blogspot.it/2013/08/tutorial-55-importare-dati-da-un-file.html
      E poi lo manipoli sempre come file .csv per estrarre le label che ti servono :) in bocca al lupo!

      Elimina
  5. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  6. il problema è che sono circa 3000 articoli con prezzi Descrizioni e prodotto

    quindi avevo pensato d'avere un data base composto da tre colonne,
    poi con il pulsante CERCA sull'app andare a interrogare il database e Trovare il Prodotto o i simili tipo:
    Click su CERCA (mele)

    | = Label

    Mele | melinda |3€
    Mele | imperial | 2,5 €

    in modo che nel server ci siano tutti i dati ma nell'app mi carichi solo il prodotto richiesto perkè se no mi caricherebbe tutti i dati con la conseguenza che non tutti i Smartphone si sovracaricano d dati non inerenti alle proprie ricerche.

    che ne pensi? caro il mio Guru :)

    RispondiElimina
  7. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  8. Una domanda sulla lettura dei dati.

    prendendo ad esempio la rubrica telefonica
    salvo in Tinydb costruendo il tag:
    n=n+1
    tag "ribrica"+n
    fino ad N tag diversi

    va tutto bene.
    rileggo perfettamente tutti i dati salvati

    B_Carica click:
    n=n+1
    Tag =rubrica+n
    fino a N tag diversi

    se alla fine vado ancora su B_Carica ho messaggio di errore
    che mi dice Empty.... ma credo sia Tag non esistente.

    Posso evitare quest'ultimo messaggio e fare in modo che andando ancora su B_Carica con tag n>N non succeda nulla? come?
    Preciso che in fase di lettura non consco il valore di N.

    RispondiElimina
  9. Ciao, ottimo lavoro. Ti volevo chiedere come mai la mia app appenainstallata si blocca alla creazione di una lista presa dal tinydb? Invece se la faccio girare, prima con app inventor, collegando il telefono al pc e poi la installo funziona perfettamente.... assurdo!!! Devo fare qualche procedura prima di generare l apk? Grazie in amticipo.

    RispondiElimina
  10. Ciao Sebastiano, ho creato una semplice applicazione per gestire l'inventario grazie ai tuoi tutorial utilizzando TinyDB, riesco a gestire tutto perfettamente, mi è rimasto un problema da risolvere , non riesco a trovare il file.xml nel telefonino e successivamente trasferirlo al PC, mi puoi dare un suggerimento...
    Grazie....

    RispondiElimina
  11. Ciao e complimenti per i tutorial che posti... sono semplici, chiari e soprattutto in italiano :)

    Mi accodo alla domanda di Capponi sul trovare il file xml che il TinyDB genera; dal tutorial "Il componente TinyDB per il salvataggio dei dati " dici che il percorso del salvataggio è /data/data/.... etc, ma io non riesco a trovarlo.
    Premetto che ho i permessi root ed ho cercato sia nella cartella sopracitata della scheda sd che nella memoria interna del telefono tramite l'app "File expert" ma con esito negativo.
    Ne avrei proprio bisogno in quanto il mio obiettivo è quello di scaricare tale file per implementare i dati in esso contenuto nel db access che ho sul mio pc
    Hai qualche altro suggerimento?

    Grazie ancora e complimenti per il tuo blog

    RispondiElimina
    Risposte
    1. Come non detto, il file sono riuscito a trovarlo... quello che non capisco è perche è vuoto?!?
      Qualche consiglio?

      Grazie

      Elimina
  12. Interessa anche come trovare il file con i dati caricati
    Grazie

    RispondiElimina