Cerca con Google

Translate

12 ottobre 2011

Tutorial 22 - Il componente TinyDB per il salvataggio dei dati


Rieccoci con un nuovo tutorial! Questa volta parleremo del componente TinyDB che si trova nella palette Basic di App Inventor.

Questo componente (di tipo non visibile, ovvero non viene visualizzato nell'interfaccia utente) viene utilizzato tutte le volte che vogliamo memorizzare in maniera "permanente" dei dati nella nostra app.


Come avrete infatti notato con gli altri tutorial, tutti i dati inseriti dall'utente (come ad esempio il testo inserito in una textbox) vengono persi non appena l'applicazione viene chiusa (attenzione, per come gestisce la memoria Android potrete aver visto che anche dopo aver chiuso e riaperto un app creata con AI, l'applicazione è ripartita dall'esatto punto dove l'avevate lasciata, ma questo non vi deve trarre in inganno, se il telefono avesse avuto bisogno di più memoria avrebbe chiuso definitivamente la vostra app ed avreste così perso i dati).

Bene, con questo componente possiamo invece salvare i nostri dati sul telefono in maniera sicura.
TinyDB permette il salvataggio sottoforma di coppie "tag" / "value".
Il tag è il nome con cui vogliamo identificare il nostro dato
mentre il value è ovviamente il valore stesso che vogliamo salvare.
Possiamo così salvare ad esempio l'high score di un nostro videogioco, oppure la textbox inserita precedentemente dall'utente oppure ancora le preferenze della nostra applicazione, insomma come avrete capito il campo di utilizzo è veramente sterminato (per esempio nella mia acqua alta app lo uso per salvare tutta la tabella coi dati di marea in modo da poter usare l'app anche off-line)

Nel nostro esempio vediamo come è possibile salvare il contenuto di una tabella formata da 2 colonne e 3 righe in cui l'utente inserisce un ipotetica nota spese.
L'esempio è volutamente semplice ma fa vedere come si utilizza il componente TinyDB per il salvataggio ed il successivo caricamento dei dati.

Il componente TinyWebDB funziona praticamente allo stesso modo ma salva i dati sul web e richiede un database TinyWeb creato dall'utente sul web (magari in futuro ne vedremo anche il suo utilizzo)

Per ora buona visione!




Per finire vediamo alcune note tecniche su TinyDB:


Proprietà

nessuna

Eventi

nessuno

Metodi

StoreValue(text tag, valueToStore)
Salva il valore dato sotto lo specifico tag. il Tag deve essere una stringa di testo, il valore può essere una stringa o una lista (array)

GetValue(text tag)
Recupera il valore che è stato salvato con il tag specificato. Se nessun valore è stato salvato ritorna una stringa vuota (empty)

I dati salvati possono essere eliminati usando la funzione di sistema di Android, andiamo in applicazioni - gestisci applicazioni - selezioniamo la nostra app. Quando selezioniamo cancella dati andremo a cancellare i dati memorizzati con TinyDB.
Per i più smaliziati, i dati salvati li trovate sotto questo path (è necessario un root explorer per visualizzare la cartella /data/)

/data/data/appinventor.ai_seblog2k.Tutorial_TinyDb/shared_prefs/TinyDB.xml

come vedete il file è un xml e può quindi essere letto e modificato agevolmente anche con altri editor.

Potete trovare il sorgente di questo tutorial cliccando qua

132 commenti:

  1. Da molto aspettavo questo tutorial!

    RispondiElimina
  2. ciao! Tramite tinyDB si possono salvare le scelte effettuate che l'utente compie cliccando su alcuni pulsanti e poi richiamarle per visualizzare dei dati in base alle scelte fatte? grazie :)

    RispondiElimina
  3. Puoi salvare qualsiasi campo testuale stringa o array, per esempio se hai una checkbox puoi impostare che alla sua pressione il valore di una variabile diventi "true" e poi con TinyDb salvi questa variabile.
    Nel momento poi in cui la carichi, reimposterai il valore della tua checkbox in base al valore caricato (quindi o true o false), spero di essere stato chiaro abbastanza :)

    RispondiElimina
  4. mmm forse ho capito...ci provo subito! grazie!

    RispondiElimina
  5. Ciao! avrei un quesito da porti? vorrei ordinare in maniera crescente (o decrescente) i valori di alcune label (o i valori di un DB) e restituirli in maniera ordinata. cosa consigli? ho visto in altri linguaggi comandi specifici. ho rozzamente sviluppato una sequenza su block editor, ma è immensa, piena di "Ifelse", label e variabili :D ) . Forse con una procedura farei meglio. ma come?

    credo esista qualcosa di molto più razionale e semplice, ma non riesco ad immaginarla. Potresti aiutarmi?
    Credo sarebbe utile per molte applicazioni. ad esempio temperature, maree, e qualunque altro insieme di dati statistici da riordinare.
    in pascal al liceo ricordo che servivano dei vettori (Array) ma quello che trovo on-line è relativo ad altri linguaggi e seppur comprensibile nel concetto di base non riesco a svilupparlo su AppInventor. Magari un prossimo tutorial potrà far luce sul mio quesito.
    Ti StraRingrazio come sempre!
    un tuo allievo fedele

    RispondiElimina
  6. un'altra domanda che mi viene da fare è la seguente: come posso importare un file CSV nel TinyDB e poi confrontare il valore inserito in una o più label o textbox con i vari valori del CSV.
    Ad esempio dato un CSV dei livelli dell'acqua alta a Venezia vorrei sapere quando e se il livello ha superato un determinato valore. oppure dato il csv dei risultati del Superenalotto vorrei sapere quando e se la sestina che inserisco nei sei (o più) textbox sono usciti.
    Grazie mille e buona serata

    RispondiElimina
  7. Ciao liberlpensiero, una cosa alla volta...:)
    1) per ordinare i valori di alcune label devi prima di tutto inserire tutti questi valori all'interno di una lista (che è poi quello che tu conoscevi come array o vettore)
    poi si può usare per esempio l'algoritmo di bubble sort per ordinarla, senza stare a rifare cose già fatte...ti linko la discussione in inglese della procedura che fa proprio quello che tu chiedi (spero tu sappia un pò di inglese)
    http://www.appinventorblocks.com/appinventor-tutorials-tips/appinventor-list-sorting-tutorial

    RispondiElimina
  8. 2) più o meno il concetto è simile a quello dell'ordinamento visto poco fa, con un block "for...range" analizzi tutti gli elementi della tua lista, poi per esempio se vuoi trovare il valore massimo confronti ogni elemento col massimo trovato fino a quel momento (quindi inzialmente col primo valore nella lista) se è maggiore, il nuovo massimo è il valore appena analizzato, altrimenti non fai nulla e analizzi l'elemento successivo in lista. Alla fine avrai trovato il tuo massimo con molta semplicità.
    Per il superenalotto avrai due liste, la sestina vincente e quella pronosticata. Prendi il primo elemento di quella pronosticata e la confronti se è uguale ad un elemento contenuto nella lista dei numeri vincenti, se si incrementi di uno un contatore che ti da il numero degli azzeccati.
    Poi analizzi il secondo numero e così via...
    In pratica sarà un doppio ciclo "for...range" (annidiato) da 6 elementi ognuno.
    Spero di essere stato sufficientemente chiaro, a volte prima di buttare giù blocchi su blocchi è meglio fermarsi un attimo e disegnare la procedura su carta ragionandoci su.
    In bocca al lupo! :)

    RispondiElimina
  9. grandeeee! Letto, capito, fatto! :)
    Grazie.

    RispondiElimina
  10. Ciao Seblog,
    grazie per i tuoi tutorial !
    Mi sai dire se è possibile salvare i dati all'uscita del programma ?
    Supponi che l'utente riempia le caselle testo, si dimentica di premere il pulsante SALVA ed esce.

    Grazie ;-)

    RispondiElimina
  11. in quel caso non verrebbero salvati i dati, devi chiamare te la tinydb con il metodo storevalue. Lo puoi fare anche all'uscita del programma, però considera che se l'utente torna alla home del suo telefono e poi il sistema Android ti forza la chiusura dell'app (per liberare memoria), la procedura storevalue non viene chiamata e i dati vengono persi.
    Se hai paura di perdere i dati puoi salvarli ogni qualvolta l'utente inserisce un nuovo valore ad esempio.

    RispondiElimina
  12. Ho pensato anch'io a salvare i dati all'uscita del programma, però non so a quale evento associare lo torevalue.
    Ho visto l'oggetto Screen, ma non ho trovato niente.
    Ho pensato anche di associarlo all'evento LostFocus dei text, come forse mi suggerisci tu, ma non so se funziona sull'ultimo valore inserito.

    RispondiElimina
  13. Ho fatto un tentativo :
    1) Creato 2 campi text
    2) Nel lostfocus di entrambi, inserito lo storevalue
    3) inserito valore nel primo text
    4) inserito valore nel secondo text
    5) esco con il tasto back
    6) rientro e trovo solo il primo dato salvato

    NON và.... :(

    RispondiElimina
  14. hai ragione, pensavo ci fosse l'evento "close app" invece non c'è, a questo punto è un bel problema...il lostfocus serviva solo sui telefoni dotati di cursore (tipo il primo desire) quindi per la maggior parte di quelli di oggi non serve a nulla...
    un alternativa potrebbe essere salvarli "a tempo" ogni tot secondi, non è molto elegante come soluzione ma in effetti non ne vedo altre.
    Se qualcuno ha altre idee si faccia avanti :)

    RispondiElimina
  15. C'è sintonia.....

    Grazie per il suggerimento

    ;-)

    RispondiElimina
  16. Ciao Seablog,

    ma con appinventor si può creare e gestire un vero e proprio db (con lettura, scrittura, cancellazione , ecc) di record??
    Per esempio per creare un app per gestire una collezione di canzoni o di film....

    RispondiElimina
  17. Puoi usare le google fusion tables che sono supportate in app inventor, spero di fare presto un Tutorial a riguardo...

    RispondiElimina
  18. :) Grazie mille!!!!
    Non vedo l'ora di vederlo.....

    RispondiElimina
  19. Grazie per tutti i tutorial che hai fatti. Sempre molto utili. Ti volevo chiedere, ma per creare un inserimento password all' accesso del programma, bisogna utilizzare lo stesso procedimento? Ma se e' facilmente leggibile ( file xml ) non c'e' sicurezza a riguardo. Consigli?

    RispondiElimina
    Risposte
    1. Ciao,esiste da design editor il componente password ma ti imposta semplicemente il testo con gli asterischi in modo che non si veda durante la digitazione.
      Una funzione vera e propria non esiste, puoi creare un qualcosa di basilare te, quando memorizzi la pwd nel tinydb esegui prima delle operazioni matematiche che poi farai al "rovesco" quando devi leggere la password.
      Per esempio l'utente inserisce 1234 tu memorizzi il risultato di
      ((1234 * 6) + 721)
      mentre in lettura farai:
      (pwd memorizzata - 721) / 6
      insomma spero di averti dato l'idea visto che funzioni apposite per il momento non ne esistono.
      La sicurezza capirai non è elevatissima ma meglio che memorizzare la pwd in chiaro in un xml nel telefono...

      Elimina
    2. grazie per l'idea, provero' il tuo consiglio...

      Elimina
  20. Ciao innanzitutto grazie per i tuoi utilissimi tutorial; volevo farti una domanda, esiste secondo te un metodo per ottenere una lista di tutti i tag salvati e contenuti nella memoria (tinyDB) per vari scopi, ad esempio per una ricerca avanzata? ciao e grazie.

    RispondiElimina
    Risposte
    1. intendi dall'interno dell'App? o in generale?
      perchè da AI devi per forza conoscere il nome del tag che vuoi estrarre mentre con un file explorer o adb puoi estrarre direttamente il file .xml con tutti i valori salvati come spiegato nella parte finale di questo articolo

      Elimina
  21. Ciao,intendevo proprio all'interno dell'app. Non esiste un modo di estrarre la lista di tutti i tag? L'unica cosa che mi è venuta in mente per ora è salvare tutti i tag contemporaneamente alla loro creazione in un array con un tag (es. LISTATAG) e manipolarlo all'occorrenza.

    RispondiElimina
    Risposte
    1. no,purtroppo non si può fare.
      la tua idea è sicuramente buona e può essere la soluzione ottimale (se hai paura di non ricordarti che tag hai salvato) bravo!

      Elimina
  22. Ciao Sebastiano, a quando un tutorial su tinyWebDB? Vorrei creare una galleria fotografica con tutte le foto inviate da chi ha la mia app...

    RispondiElimina
    Risposte
    1. non credo TinyWebDb sia la soluzione giusta,ti serve anche un server dove memorizzare le immagini ed un metodo per poterle caricare su questo server.
      Forse siamo al limite delle possibilità di app inventor, cmq se mi viene qualche idea ti faccio sapere! ciao

      Elimina
    2. Grazie, aspetto le tue sofiate ;-)

      Elimina
    3. Ciao nessuno ha trovato un modo per poter salvare delle foto su di un server web? Tipo DROPBOX.. oppure sul nostro pc in casa?

      Ho trovato questa guida, da due giorni che faccio tentativi ma sembra che si possano salvare solo dati testuali via web. In tutti i casi ve lo suggerisco, sembra molto interessate:

      https://developers.google.com/appengine/docs/python/overview

      Grazie a tutti e complimenti SEBASTIANO




      Elimina
  23. Ciao Sebastiano, sto seguendo da un pò i tuoi tutorial e sto facendo un'applicazione di un parco divertimenti che permetta di prenotare le varie attrazioni, facendo una fila "virtuale" quindi non stando veramente in fila un pò una sorta di VPASS di Mirabilandia(non so se conosci) soltanto fatto su un cellulare invece che con un dispositivo elettronico fatto apposta, avevo pensato di memorizzare la prenotazione di un'attrazione da parte di un utente su un server centralizzato del parco che gestisca tutte le varie prenotazioni dei vari visitatori, ma avendo capito che il TINYDB salva solo sul cellulare dell'utente, come potrei implementare tutto questo?

    RispondiElimina
    Risposte
    1. Puoi usare tinywebDb che salva e legge i dati da un server web, cmq mi sembra abbastanza difficile come progetto, buona fortuna!

      Elimina
  24. Ciao Sebastiano,
    molto bello questo tuo blog. Potresti dirmi come fare a scaricare il codice sorgente che citi nel video, io non l'ho trovato.
    Grazie comunque

    Franco

    RispondiElimina
    Risposte
    1. Scusa, non mi ero accorto di non aver poi messo anche il sorgente, cmq ora lo ho aggiunto, lo trovi alla fine del post, ciao e grazie per avermi fatto notare questa mia distrazione :)

      Elimina
  25. Ciao Sebastiano ,è possibile utilizzare il componente tinywebDb per leggere e scrivere un DB Mysql ?

    Grazie

    RispondiElimina
    Risposte
    1. No, TinyWebDb lavora solo con un server App Engine e nel formato JSON,
      una cosa "simile" a MySql potrebbe essere utilizzare un foglio google spreadhseet ed "interrogarlo" con le API Google Visualization (https://developers.google.com/chart/interactive/docs/querylanguage?hl=it-IT)
      dove puoi dare ad esempio i comandi "Select", "Where" , etc...

      non è la stessa cosa ma è quanto di più vicino si possa fare oggi
      altrimenti ci sono anche le Fusion Tables ma non è garantito il supporto da AI dopo dicembre quando smetteranno di funzionare le API attuali che stanno utilizzando in AI...

      Elimina
    2. Grazie mille ,sei stato molto gentile.
      Buon lavoro e complimenti per il blog ed i tutorial.
      Spero che tu non smetta di pubblicarne .

      Elimina
  26. come è possibile sommare risultati decimali delle textlabel quando app inventor non riconosce la virgola come punto?ho fatto il trucco di moltiplicare tutto per 100 e poi dividere ma si appesantisce la app.

    RispondiElimina
    Risposte
    1. purtroppo finchè AI non supporterà correttamente l'internazionalizzazione si può solo usare il trucco visto nel forum,al momento non mi vengono in mente altre soluzioni
      Puoi provare a fare una procedura che fa tutto in automatico e la richiami ogni volta che devi fare una somma o un operazione aritmetica nella tua app...

      Elimina
  27. grazie. Ho seguito il tutorial per il TinyDB ma non mi salva nulla. io devo salvare le selezioni di diverse listpicker e alcuni dati inseriti nelle textbox.si possono salvare solo textlabel?

    RispondiElimina
    Risposte
    1. puoi salvare qualsiasi dato in forma testuale o numerica, anche una lista volendo
      se devi salvare più listpicker devi leggere il valore di ritorno del listpicker (quello numerico ad esempio) e poi con una maketext crei il valore da salvare nel tinydb
      poi quando vai a leggere il valore dovrai fare il processo inverso ovvero saprai che alla posizione "x" nella lista hai il valore "y" che andrai ad assegnare al tuo listpicker o a come hai improntato la tua app.
      per esempio puoi salvare in un tinydb con tag "datisalvati"
      una maketext composta da 1,1,2,1
      1 è la selezione della prima listpicker,
      1 è la selezione della seconda listpicker,
      2 è la selezione della terza listpicker e così via
      se vuoi più aiuto posta i tuoi blocchi nel forum, ciao

      Elimina
  28. se è possibile invierei, non so dove,il file zip.come inserisco qui le immagini?

    RispondiElimina
    Risposte
    1. se ti registri sul forum puoi postare immagini o anche link al file zip, altrimenti se hai problemi scrivi in email, grazie

      Elimina
    2. Ciao a tutti, perdonate l'O.T. ma approfitto che si parli di forum per segnalare (già fatto con una mail) che ho difficoltà ad iscrivermi al forum, appunto, in particolare con "To use reCAPTCHA you must get an API key from". Seba appena hai tempo dimmi cho e fare, grazie.

      Elimina
    3. grazie mille!è vero era un problemino di configurazione nel forum, ora dovrebbe essere a posto puoi riprovare a fare la registrazione e poi mi fai sapere! grazie mille a te questa volta :)

      Elimina
  29. Ho verificato sotto gestioni applicazioni anche io ho i 4 Kb il che vuol dire che salva allora il problema come dici tu deve essere il caricamento.provo a smanettare!!

    RispondiElimina
  30. Le if dentro loaddata sono necessarie?

    RispondiElimina
  31. caricamento textbox riuscita, ora devo caricare le immagini che sono state scelte con listpicker

    RispondiElimina
  32. forse sto cominciando a capire.
    1)Nel salvataggio avevo messo la selezione della listpicker mentre devo mettere il risultato (text o immagine).
    2)Nel comando loaddata inserendo la if con i relativi comandi associati al salvataggio ora mi salva sia i testi che le immagini selezionate in precedenza.
    Ora deve ripetere l'operazione per tutti i 125 elementi della mia app!!!!speriamo che non si blocca

    RispondiElimina
  33. applicazione completata!!!!:) Rimane il fatto che il block editor è troppo lento!!!!

    RispondiElimina
    Risposte
    1. Ciao Danilo,ho tolto alcuni tuoi commenti poco pertinenti alla discussione (spero non te la prenda ma ne va della leggibilità del blog per altri utenti)
      per il blocks editor lento potresti provare ad installare app inventor in locale, è abbastanza complicato ma sto terminando un tutorial a riguardo, altrimenti sul forum ho scritto alcuni link su istruzioni per farlo,se pubblichi l'app metti anche il link nel forum,a presto!ciao

      Elimina
  34. ciao! ti ringrazio per i tuoi super tutorial che hai fatto!
    Volevo chiederti un suggerimento io devo generare un file csv,quindi converto la lista con l'oggetto "list to csv row",nel quale devo salvare mano a mano tutti i dati il tiny db sovrascrive ogni volta o c'è il modo per fargli aggiungere dati ad un solo file?

    grazie ancora buona giornata!

    RispondiElimina
    Risposte
    1. Ad ogni tag corrisponde il salvataggio di tutti i dati in una volta sola, non si possono aggiungere ad esempio riga per riga.
      Quindi se salvi nel tinydb il csv, al salvataggio successivo ri salva tutto daccapo,l'operazione è cmq istantanea quindi non vedo problemi a riscrivere anche i vecchi dati ogni volta.

      Elimina
    2. Scusa mi sono espresso male io quello che devo fare è generare un file csv che tenga memoria di tutti i dati che inserisco nei textbox di volta in volta una roba del tipo : riga 1 valore inserito la prima volta
      riga 2 valore inserito la seconda volta

      Elimina
    3. Allora in questo caso puoi fare così:
      1 - usi la textbox per far inserire il valore all'utente
      2 - usi una label (che può anche essere non visibile nell'interfaccia utente) dove memorizzi "in coda" il nuovo valore inserito a quelli esistenti
      basta usare una make a list dove il primo elemento è la lista stessa e il secondo è la textbox inserita dall'utente
      3 - quando vuoi salvare i dati , salvi la label nel tinydb
      4 - quando li vuoi in formato csv usi la funzione "list to csv" della tua label
      spero di essere stato più chiaro adesso :)

      Elimina
    4. molto! grazie!

      ultima domanda

      ma i dati vengono sovrascritti ogni volta vengono salvati nel tinydb ?

      Elimina
    5. si, lui salva nel "tagname" tutto quello che gli dai, quindi ogni volta riscrive tutto (ma questo non è un problema a mio modo di vedere)

      Elimina
  35. ciao sebastiano i tuoi tutorial sono veramente formidabili.... li seguo tutti passo passo sperando di imparare piu in fretta possibile... grazie davvero... cmq adesso mi servirebbe un aiutino credo ke per te non sia un problema ma io cio' provato in tutti i modi e non mi riesceeeeeee..... cmq come faccio a salvare un'immagine ke ho caricato dal telefono sulla mia aplicazione, vorrei ke una volta salvata restasse come sfondo della mia home anke quando kiudo e riapro... l'aplicazione!

    RispondiElimina
    Risposte
    1. ma l'immagine deve fare da sfondo alla tua app o al telefono?
      perchè se la vuoi usare come wallpaper, non si può fare con App Inventor,
      se invece sarà lo sfondo della tua app devi prima caricare quest'immagine come "media" nel design editor dopodichè la imposti come sfondo nella tua app e con tinydb salvi questa impostazione per la prossima riapertura dell'app, la cosa non è semplicissima ma è fattibile

      Elimina
  36. Ciao, il tuo blog è davvero utilissimo e mi è servito per creare qualche piccola app di prova.
    Ora, però, ho un enorme dubbio visto che nella nuova app vorrei inserire una tabella con la maggior parte delle colonne vuote nelle quali inserire i dati che mi interessano.
    Visto che si tratta di un elenco che raccoglierà i nomi dei partecipanti a un corso la tabella avrà inevitabilmente più di 20 righe e almeno 6-7 colonne (presenze, voti ecc).
    Come gestire una tabella così grande? Meglio disegnarla con programmi esterni (tipo excell) o direttamente in AI utilizzando i textbox e il tinybd? Vorrei qualcosa di funzionale da gestire, visto la grande quantità di dati che dovrò inserire. Ho provato ad usare la procedura descritta nel tutorial per un costruire un piccolo timetable ma ho seri dubbi che possa andare bene per tabelle più complesse.
    Grazie per l'attenzione.

    RispondiElimina
    Risposte
    1. Mmmhhh, secondo me ti conviene usare le fusion tables, se hai dimestichezza con sql non avrai grossi problemi,
      altrimenti potresti provare sempre con google docs spreadsheet , visto che anche questo tipo di tabella può essere scritta con app inventor,
      scarterei il tinydb se appunto hai tante righe e tante colonne, di contro l'app avrà bisogno della connessione per funzionare.
      Prova a guardare questo tutorial (in inglese) per google spreasheet (al momento io non ho tutorial simili):
      http://puravidaapps.com/taifunGS.php
      è un pò complicato ma se lo guardi con calma è fattibile

      Elimina
  37. Ok, grazie per i suggerimenti. Proverò con le fusion tables perchè non volevo che l'app per accedere ai dati si collegasse obbligatoriamente alla rete.
    Mi chiedo però se con molti dati salvati sul cell, di contro, non rischi di diventare troppo pesante e quindi troppo lento. Mmm, ci dovrò pensare bene.
    Grazie ancora per il blog, utilissimo e sempre aggiornato. Continua così!

    RispondiElimina
    Risposte
    1. solo una precisazione, le fusion tables devono avere una connessione per funzionare...
      non credo che i molti dati siano un problema (almeno non finchè si parla di circa 1000 righe di dati),
      se però vuoi che l'app lavori anche offline allora purtroppo l'unica soluzione resta il tinydb che ha due svantaggi, 1-devi gestirti te la creazione di righe/colonne 2-i dati sono salvati in locale e non condivisi con altri utenti dell'app

      Elimina
  38. Muchas gracias, impresionante tus tutoriales, he aprendido mucho. Ahora me gustaria aprender el Tinywebdb, me gustaria que subieras algun tutorial.
    De nuevo Muchas gracias.

    RispondiElimina
    Risposte
    1. Thanks very much,i'm happy to know that also people from Spain follow my blog :)
      I've same plans for a TinyWebDb tutorial , so stay tuned (but maybe first i'll do a Fusion Table tutorial that in my opinion is more flexible)

      Elimina
  39. Ciao Sebastiano, bellissimo il tuo blog! Sono da un paio di anni nel Mondo Android e mi trovo molto bene, proprio per questo ho deciso di avventurarmi nel mondo di AppInventor...
    Allora premetto che sono ancora all'inizio dei tutorial, diciamo che però volevo già farmi un'idea per un salvataggio di un possibile file... Ossia, chiariamo che non ho il telefono roottato, è possibile utilizzare l'elemento TinyDB e poi fare un "Salva" che mi salvi quello che ho memorizzato in un file di testo? Che sia un txt o excel non importa, basta che si legga. Grazie per l'aiuto e il sicuro chiarimento.

    RispondiElimina
    Risposte
    1. Ciao Mattia, direttamente e solo con TinyDB purtroppo non è possibile, il componente salva nella cartella /data/ che non mi risulta sia accessibile in telefoni che non hanno permessi di root.
      Per poter salvare in qualsiasi posizione della sd card è necessario utilizzare activitystarter con un piccolo programma scritto in java (che deve essere installato sul telefono),
      la soluzione la trovi descritta qua
      http://puravidaapps.com/savetosd.php
      (in inglese) ma è abbastanza facile da tradurre.
      A me come soluzione non piace perchè obbliga ad avere installate due app, quella creata con AI e l'altra di "appoggio"
      Speriamo trovino soluzioni migliori, ad oggi se vuoi salvare i dati e poi leggerli al di fuori di AI questo è l'unico metodo.
      Se invece il fatto di usare la rete non è un problema allora puoi salvare i tuoi dati per esempio in google drive così da poter poi leggere questi dati anche dal web.
      fammi sapere in che direzione vuoi andare e magari ti posso suggerire meglio :)

      Elimina
    2. Penso di provare entrambi :) ma la soluzione di Google Drive mi ispira di più, visto che mi sembra meno "limitata" come soluzione, e non per forza avere installata una seconda app apposta. Poi ti farò sapere :) Grazie Mille.

      Ne approfitto per chiedere un'altra cosa se permetti, per fare invece una specie di Notepad (Intendo una casella di testo che mi permetta di salvare ciò che scrivo e di poter salvare questo file sul telefono) quindi senza colonne ma solo una casella di testo senza DB. è possibile avere un piccolo tutorial? O per lo meno solo una spiegazione di come si può effettuare il salvataggio del file. ANche una breve spiegazione dei comandi da usare :) se puoi ovviamente. Grazie comunque Sebastiano.

      Elimina
    3. bene! fammi sapere come va!
      per il discorso applicazione tipo notepad non cambia nulla, il TinyDb salva semplicemente del testo associato ad un'etichetta, il testo quindi può essere una tabella (perchè magari salviamo la tabella in .csv) oppure anche un campo solo come tutto il testo scritto in una textbox, dipende da cosa vogliamo che il TinyDb faccia nella nostra app.
      Il "problema" cmq rimane, ovvero TinyDb non salva in una directory accessibile (se non si hanno appunto i permessi di root)
      Qui trovi una spiegazione di come si aggiungono delle righe ad uno spreadsheet in GDrive:
      http://puravidaapps.com/taifunGS.php

      Elimina
    4. Grazie di nuovo della spiegazione, credevo cambiasse qualcosa, nel senso che era possibile salvare in qualche maniera con una TextBox senza passare per un DB ;) Gentilissimo da parte tua rispondere. Ti farò sapere un po' i risultati ;)

      Elimina
  40. Ciao Sebastiano e complimenti per l'ottimo aiuto che fornisci col tuo blog...

    Sto cercando di realizzare un'app che ritenevo molto semplice ma ho paura di andare a cozzare con i limiti di App Inventor (o, più semplicemente, del mio cervello :P)

    Devo inserire nome e cognome di circa 200 persone e poi visualizzarle tutte in una lista che comprenda Nome e Cognome della persona e a seguire tutti i mesi dell'anno.

    Per ogni mese vorrei poter aggiornare un semplice valore Booleano: vero o falso.

    Si può realizzare con app inventor o bisogna passare a qualcosa di più potente?

    Non riesco ad immaginare quale potrebbe essere la logica di funzionamento corretta.

    Io so salvare i dati in TinyDB ma non mi viene in mente come poter creare una lista di valori sicuramente univoci (non inserire due volte lo stesso utente, per esempio) e cambiare i valori relativi al mese da vero a falso.

    Penso di dover sempre salvare tutta la tag, giusto? Quindi sovrascrivere un record identico salvo che per il cambio (ad esempio) del mese di Gennaio da vero a falso.

    Mi suggeriresti anche solo qualche orientamento logico su come tu faresti una simile applicazioncina senza perdere tempo con le idee strampalate che mi vengono?

    Grazie per il tuo tempo e la tua pazienza!

    RispondiElimina
    Risposte
    1. Ciao Pitt,se non è un problema per te avere la rete a disposizione, ti consiglio assolutamente di usare le fusion tables,
      in questo modo risolvi tutti i tuoi problemi, puoi creare quanti record vuoi ma sopratutto hai le funzioni sql per andare a ricercare se un nome esiste già e quindi aggiornare il record o crearne uno nuovo.
      Non ho ancora fatto dei tutorial sulle fusion tables ma se sei minimamente pratico di sql non è molto difficile, per ora ti lascio questo bel tutorial in inglese sperando che ti sia utile
      http://puravidaapps.com/taifunFT2.php
      spero cmq di realizzare a breve dei tutorial anche sulle FT

      Elimina
  41. Ciao Sebastiano, ultima cosa, se però con la Table Arrangement imposto 3 colonne (Table con Fill parent) e poi dentro metto 3 text box (Anche queste in fill parent) non me le fa stare nello schermo una difianco all'altra ma ne visualizzo solo 2 affiancate, infatti anche nell'App Inventor me ne affianca solo 2. Come devo fare? Grazie.

    RispondiElimina
    Risposte
    1. La TableArrangement secondo me è un pò "buggata", se hai solo 3 colonne usa un horizontal Arrangment in fill parent (per la width) e inserisci al suo interno le tre textbox (anch'esse in fill parent), vedrai che così le visualizzi tutte e tre
      Se devi fare una tabella conviene mettere un vertical arrangement e poi al suo interno un horizontal arrangment

      Elimina
    2. Mi sembrava strano che mi desse certi problemi, infatti per ora mi sono arrangiato con gli Horizontal, ma ho preferito chiedere comunque per sicurezza ;)
      Ti ringrazio per l'aiuto! Ciao Sebastiano!

      Elimina
  42. Mi sembra di aver capito che questo tipo di sorgente non funge con l'emulatore, o forse è solo un mio problema?

    RispondiElimina
    Risposte
    1. no, il TinyDb funziona perfettamente anche con l'emulatore, l'unica cosa è che se lo chiudi e poi lo riapri non trova più i dati (perchè in pratica riparte da capo con la memoria "pulita")
      ma se lasci aperto l'emulatore e chiudi solo l'app che hai creato, alla prossima riapertura puoi rileggere i dati che avevi salvato

      Elimina
  43. Ciao, ho la necessità di creare un'applicazione per gestire il bilancio di una piccola azienda...cosa mi consigli di utilizzare TinyDB o fusion tables?? con fusion tables c'è il problema che se l'applizaione la installo in uno smartphone altrui dovrà accedere con il mio account per leggere i dati giusto??
    Grazie

    RispondiElimina
    Risposte
    1. Ciao, se devi gestire il bilancio e aggiornarlo da più terminali, sicuramente fusion tables.
      Con la versione attuale del componente per la gestione delle fusion, puoi avere quanti account col permesso di modificare la tabella.
      Però chi crea la tabella ovviamente deve specificare uno per uno quali sono gli utenti che possono avere accesso in lettura/scrittura ad essa.

      Elimina
  44. Ciao Sebastiano, volevo sapere se ci fosse un modo per esportare il tinyDB in formato CSV e poi ripristinarlo, cioe da CSV in tinyDB(che poi il tinyDB dovrebbe essere un xml).

    Grazie

    RispondiElimina
    Risposte
    1. Devi avere i permessi di root, allora puoi accedere alla cartella data dove si trova il file xml,
      poi penso che con excel o roba simile si possa passare l'xml in csv senza grosse difficoltà, tanto l'xml è anch'esso testuale...:)

      Elimina
  45. grazie infinite, mi sei stato d'incredibile aiuto. ce ne fossero altri come te, sarebbe tutto più facile. grazie

    RispondiElimina
    Risposte
    1. Grazie troppo buono! diciamo che cerco di dare una mano ma il tempo è sempre tiranno! :)

      Elimina
  46. Ciao Seba, e se io dovessi realizzare una app che visualizzi gli orari di una linea di autobus, ad esempio una extraurbana, che ha una lista di paesi da dove parte a dove arriva e per ogni fermata un orario? E' meglio il tinydb o appoggiarsi ad un sito web esterno? Tieni conto che sarebbe utile avere una funzione di ricerca, o per orario o per paese ( ad esempio: da Milano a Lodi partenze 7.00 - 8.00 eccetera).
    Ciao Manuel

    RispondiElimina
    Risposte
    1. Ciao Manuel, in questo caso forse utilizzerei le fusion tables, così puoi gestire le tabelle anche da web e poi puoi usare la sintassi "simil" SQL per fare le tue query che è molto più versatile rispetto al tinydb
      Prova a darci un occhio, non ho ancora un tutorial specifico sulle fusion ma in rete si trova parecchio materiale, buona fortuna!

      Elimina
  47. Ciao Seba, io vorrei realizzare un app dal concetto semplice, ossia un logbook (n record salvati con n informazioni per ogni record salvate, e quindi poi rileggibili record per record), ma forse di realizzazione un po' più complessa. Da come leggo sui commenti TinyDB non va bene per questa idea, ma ci vorrebbe fusion table come già consigliato ad altri. Dico giusto?
    Grazie mille! Ciao Laura
    PS: i tuoi tutorial sono davvero ottimi!! continua così !!

    RispondiElimina
    Risposte
    1. dipende...se vuoi che l'accesso sia anche offline e non ti importa del fatto che i dati siano memorizzati solo sul tuo cellulare puoi usare TinyDb (che forse è anche leggermente più semplice)
      se invece vuoi una soluzione che lavori anche in cloud e che possa lavorare sullo stesso db da persone diverse allora meglio le fusion tables.
      Poi dipende anche dalle dimensioni del db, fino a 100-200 record il TinyDb può andare bene,dopo diventa un pò troppo lento.
      ps: grazie dei complimenti :)

      Elimina
  48. Salve Sebastiano,
    volevo chiederti io ho creato un'applicazione che vorrei dividere in due parti un Mobile e una Tabet e vorrei usare il TinyDB per memorizzare le impostazione all'accesso cioè quando l'utente per la prima volta accede all'applicazione gli uscirà se vuole usare o la ver. MOBILE o TABLET ma la seconsa volta gli dovrà uscire automaticamente quello che ha scelto in precedenza con i BUTTON

    RispondiElimina
    Risposte
    1. usa il tinyDb e memorizzi un tag con nome che ne so "tipo dispositivo"
      poi in screen1.initialize vai a controllare il tinyDB, se esiste quel tag ed ha uno dei due valori "mobile" o "tablet" esegui le azioni corrispondenti.
      Il procedimento è lo stesso di quello visto per esempio per la memorizzazione dell'EULA all'avvio dell'applicazione oppure di quello che vedi in questo stesso tutorial.

      Elimina
    2. Senti Sebastiano perché non crei un nuovo tutorial che spieghi questo e lo inserisci nel tuo sito e sarà utile a me e a chiunque visiti il tuo sito

      Elimina
    3. perfetto! son contento che hai risolto da solo :)

      Elimina
  49. Buongiorno Sebastiano,

    spulciando per il web ho trovato un app che permette di leggere i feed-rss (http://appinventorapi.com/rss-feeds/) che utilizza il componente TinyWeb; il problema è che i collegamenti ipertestuali non risultano attivi (di conseguenza la funzione a mio giudizio perde gran parte del suo valore intrinseco), mi chiedevo quindi se ti risulta l'esistenza di altro oppure se sai darmi qualche consiglio su come realizzare un feed-aggregator.
    Sperando di essere stato chiaro, ringrazio per l'ottimo lavoto.

    RispondiElimina
    Risposte
    1. non credo AI sia lo strumento più adatto perchè dovresti fare il parsing a mano di tutto il file xml (o feed rss) ed estrarre i link ipertestuali per poi renderli cliccabili nella tua app...davvero un lavoraccio!
      ho visto il link che hai inserito, è cosa abbastanza vecchia e si appoggia ad uno script php esterno quindi come soluzione non è l'ideale.
      Forse per un feed-aggregator è meglio usare cose tipo appsbar... :)

      Elimina
  50. Ciao Sebastiano,
    scusa per la domanda ma ho cercato una risposta senza trovarla...come faccio per memorizzare lo "stato" di un bottone? Sto facendo una semplice app per gestire una collezione; assegno ad ogni bottone l'immagine dell'elemento collezionato e lo "inserisco" in collezione premendo il bottone.
    Poi imposto il bottone che, per esempio, cambia colore di fondo o altro per evidenziare la presenza dell'elemento nella collezione.
    Spero di essere riuscito a spiegarmi.
    Scusa se la domanda è banale ma ho cercato senza riuscirci di trovare da solo la risposta...
    Grazie

    RispondiElimina
    Risposte
    1. Il bottone non ha uno stato persistente, perchè viene premuto e poi rilasciato, quindi hai solo l'evento "click" se vuoi memorizzare lo stato devi usare per esempio una "checkbox" che allora può avere valore nel "checked" di true o false.
      Questo è quello che devi memorizzare nel TinyDb, altrimenti puoi associare le due cose e alla pressione del bottone metti a "true" il valore di un corrispondente "checkbox",
      poi crei una lista di tutte le tue checkbox e salvi questa lista nel TinyDb così la puoi caricare all'avvio successivo dell'app.
      Per esempio hai button1,checkbox1,button2,checkbox2
      Imposti al click di button1 di mettere "true" checkbox1 e così via
      Mettiamo che l'utente clicca solo sul primo bottone,quando poi preme un eventuale button per il salvataggio dei dati salvi nel TinyDb (true,false) ovvero la prima "checkbox" è stata premuta l'altra no.
      spero di essermi spiegato, ciao

      Elimina
    2. Ciao Sebastiano grazie per la tua risposta... Allora ho dovuto abbandonare il mio progetto che ho ripreso in questi giorni e leggo ora la tua risposta. Torno a seguirti!

      Elimina
  51. Ciao Sebastiano

    Sono Michele, ho trovato molto interessante e chiaro il tuo tutorial, vorrei chiederti se è possibile creare una app che inseriti dei valori li memorizzi in un file excel già esistente ed in specifiche celle.
    Il caso in questione è proprio una nota spese, ma avendo un unico file excel aziendale (che posso eventualmente inviarti), sono costretto ad utilizzare questa modalità. in pratica io devo per ogni giorno lavorato, inserire nella nota spese una descrizione dello spostamento, i km fatti ed eventualmente l'ammontare del rifornimento.

    Attualmente apro il file direttamente sul note2, ma essendo la pagina abbastanza grande vorrei trovare un sistema per riempire queste 3 celle senza impazzire.

    Grazie.

    RispondiElimina
    Risposte
    1. Non in un file excel perchè non è supportato da App Inventor,
      puoi fare due cose, o usi le Fusion Tables oppure un documento spreasheet di google docs.
      Allora queste tabelle le puoi leggere e scrivere da AI,
      per farti un idea usando Google Spreadsheet guarda (in inglese) questa pagina qua:
      http://puravidaapps.com/taifunGS.php
      sperando che ti possa essere d'aiuto
      ciao

      Elimina
  52. Il tutorial è fatto benissimo!
    Vorrei porre una domanda..
    Come potrei fare, mettiamo il caso che facessi molteplici inserimenti, ad inserire tutti i dati del tinydb in una unica label?
    Il programma che sto sviluppando io in sostanza acquisisce i dati di una persona (nome, cognome, tel, mail...) e li inserisce nel tinydb. Quello che vorrei è che, alla persona successiva, i dati si trovassero insieme ai precedenti ad esempio in un unico campo (label... text ... o quello più idoneo) magari ordinati dalla virgola.

    nome1, cognome1, tel1, mail1
    nome2, cognome2, tel2, mail2

    tutti in insieme così incolonnati.

    Spero di aver spiegato bene il mio problema..

    Grazie infinite!

    Fabi078

    RispondiElimina
    Risposte
    1. Devi "costruire" i tuoi dati prendendo tutti i dati precedenti e poi aggiungendo i nuovi.
      A seconda di come hai organizzato il TinyDb lo puoi fare per esempio con il "make a list" (se i tuoi dati sono in una lista) dove il nuovo contenuto del TinyDb è dato da
      make a list = lista precedente + nuovo elemento
      spero di essermi spiegato, senza mostrarti i blocchi è un pò complicato ma il concetto è questo :)

      Elimina
    2. Grazie per la tua disponibilità Sebastiano!
      Se puoi, hai modo di inviarmi uno screeshot per vedere quali blocchi sono implicati?
      Il mio progetto è completamente ispirato al tuo!!
      Grazie infinite ancora!!!

      Un saluto

      Fabio

      Elimina
    3. Ciao Fabio, mi hai dato l'ispirazione per un nuovo tutorial che spero di fare a breve,
      intanto ti do un "assaggio", il sorgente che userò...

      https://docs.google.com/file/d/0BxHg0fjQtiz2X1NTektVczZrMnM/edit?usp=sharing

      si vede in maniera semplice come aggiungere i dati al tinydb,visualizzarli,salvarli e cancellarli
      se ancora qualcosa non sarà chiaro aspetta il mio tutorial dove spero di chiarire ogni dubbio !

      Elimina
  53. Ciao, innanzi tutto grazie per i tuoi tutorial, anche uno negato come me è riuscito a fare qualcosa.
    Ho un quesito, è possibile salvare una foto in una screen richiamandola da una selezione con image piker che si trova in un'altra screen?
    è probabile che non mi sia spiegato bene, ma non so come chiederlo.....

    RispondiElimina
    Risposte
    1. prova a guardare i tutorial sui Canvas ed il metodo CanvasSaveAs...
      ed anche quelli per il multiscreen per passare i parametri da uno screen all'altro

      Elimina
  54. Ciao e grazie per i tuoi tutorial, davvero utili! Avrei bisogno di un tuo consiglio.... Vorrei che quando un elemento della lista viene "spuntato" attraverso la checkbox, una volta cliccato un pulsante "next", mi si apra una pagina con il riepilogo di ciò che è stato scelto nella lista. Questo elenco poi, vorrei inviarlo via sms o via mail, è possibile? Mi spiegheresti come si fa? Grazie mille Silvia.

    RispondiElimina
    Risposte
    1. Ciao Silvia, ci sono vari modi per farlo, ti consiglio di provare così
      crei due liste, chiamiamole Lista A e Lista B
      Nella A hai tutti i tuoi elementi, ad ogni elemento associ una checkbox, quindi
      Elemento 1 - checkbox 1
      Elemento 2 - checkbox 2 e così via
      Quando l'utente preme il tasto next, vai a vedere quali checkbox sono selezionate, supponiamo siano la 1 e la 3...
      A questo punto crei la Lista B prendendo solo gli elementi 1 e 3 (usando il select list item e prendendo gli elementi originari di Lista A)
      Ti conviene inserire tutto in un ciclo che verrà eseguito "n" volte, dove n è il numero degli elementi in Lista A.
      Il "problema" è che la tua lista dovrà avere una lunghezza finita perchè devi sapere in anticipo quante checkbox mettere.

      Altra soluzione potrebbe essere quella di usare un ListPicker,
      quindi la Lista A la metti nel ListPicker, e non metti nessuna checkbox.
      Ad ogni evento AfterPicking sai che l'utente ha scelto un elemento da Lista A, copi questo elemento nella nuova Lista B e vai così a creare la Lista B con gli elementi scelti.
      Qui il problema è che l'utente potrebbe scegliere più di una volta l'elemento nella Lista A...

      Volendo puoi anche modificare la Lista A dopo l'evento AfterPicking cancellando l'elemento da Lista A e copiandolo in Lista B (così sposti in pratica gli elementi da A a B)

      prova a vedere te quale soluzione può andare meglio, spero di essermi spiegato abbastanza bene... :)

      Elimina
  55. Grazie per la risposta super veloce :) Premetto che mi sono approciata ad App Inventor da poco e devo ancora capire tante cose. Io ho una lista di checkbox, un menù di un ristorante, e vorrei che l'utente potesse scegliere quello che desidera e poi cliccando su "next" gli venisse offerto un riepilogo delle scelte fatte per poi inviarle al ristorante tramite un pulsante "invia". Nei tuoi tutorial è spiegato? Perchè li ho visti tutti ma non capisco come risolvere il problema. Non so come muovermi sul blocks editor. O.o

    RispondiElimina
    Risposte
    1. un tutorial proprio uguale non c'è, ma devi prima impratichirti con le liste e app inventor
      c'è il tutorial su come si inviano le email che ti può tornare utile,
      cmq la gestione delle liste e checkbox è un pò una cosa di programmazione generale, che si faccia in app inventor o con altri linguaggi cambia poco.
      Prova anche a frequentare il forum, magari trovi anche altri disposti a darti una mano, in bocca al lupo!

      Elimina
  56. Ciao Sebastiano!!
    Ed invece se voglio salvare le città italiane? Vorrei fare quest'applicazione per un mio cuginetto: creo una lista con le venti regioni, poi per ogni lista voglio salvare le città per poi caricarle al momento in cui seleziono la regione.. Si può fare?

    Grazie mille, ho visto che dedichi parecchio tempo al blog e ai video, grazie a te possiamo creare qualsiasi applicazione =)

    RispondiElimina
    Risposte
    1. Si certo che lo puoi fare,
      come hai detto te devi solo creare le due liste
      Poi le puoi salvare con TinyDB (magari con due tag diversi) e quando devi selezionare regione e città magari usi dei listpicker in modo da visualizzare tutto l'elenco delle regioni e successivamente quello delle città.
      Insomma ci son sempre svariati modi per affrontare il problema, prova a guardarci un pò e poi fammi sapere
      cmq il concetto non si discosta molto da questo, guarda anche i tutorial sulle liste e array per farti un idea di come salvare i dati nella tua app! buon app inventing :)

      Elimina
    2. Seb =D grazie per la risposta =)
      Mi sono accorto di aver scritto male, volevo dire poi per ogni regione voglio salvare le città e così via, ma vedo che hai comunque interpretato bene la mia richiesta =)
      Sai, ho comunque difficoltà a riguardo, perché non riesco a capire bene come implementare il tutto, eppure dovrebbe essere davvero semplice.. Sto provando, una soluzione è stata quella di creare una lista contenente le regioni (e fin qui..), però non riesco ancora ad arrivare sul come poter scegliere la regione preferita e salvare le città..
      Sai, ho pensato anch'io sia la stessa cosa del tutorial che hai pubblicato: cambiando le variabili, l'applicazione che voglio creare può essere uguale alla tua pensando di salvare la lista della spesa di giorni diversi. Mi spiego meglio, la lista del tutorial, correggimi se sbaglio, è valida per una sola giornata (torni a casa e controlli). Ma se domani vai a fare nuovamente la spesa, salvi i nuovi dati ma non ti ritrovi più i dati di oggi (invece del pane ci sarà il latte). Questa applicazione, modellata con la spesa di giorni diversi, può essere utile anche per confrontare i prezzi (ieri sono andata da Pippo, il pane costava 1 euro, oggi da Peppe e costa 80 centesimi ;) ). Non so se altri hanno posto i miei stessi quesiti o hanno il mio stesso problema, riusciresti a fare un altro piccolo tutorial aggiornando il progetto già realizzato spiegando anche come fare per salvare la lista di giorni diversi?

      Non è la sola app che ho ideato, altre sono complete e funzionanti alla perfezione, e tutto grazie alla tua pazienza, ci tenevo a sottolinearlo e a ringraziarti =)

      Elimina
    3. beh dai mi sembra che sei già abbastanza "colto" in materia AI
      Cmq per il tuo primo quesito dipende tutto da come vuoi organizzare i tuoi dati, potresti anche fare una lista di liste...
      ovvero mettere dei blocchi "make a list" in cascata per creare una lista dove il primo indice è la regione ed il secondo la città
      Quindi ad esempio la tua lista potrebbe essere strutturata tipo [ti riporto giusto un esempio]:
      ((Lombardia),(Milano,Brescia,Monza,Como,Lecco,Varese,Pavia))
      ((Veneto),(Venezia,Treviso,Belluno)
      Quindi per selezionare un elemento devi sempre dare due valori con un "select list item" annidiato,
      se vuoi scegliere brescia per esempio avrai prima un select list item con indice 1 e poi un select list item con indice 2
      Questo per farti capire (spero) come accedere ai dati nella tua lista, sempre un esempio di una possibile implementazione.

      Per il discorso di questo tutorial, qui ogni volta che clicchi salva, l'app sovrascrive i dati precedenti, lo vedi facilmente da come è strutturato il blocks editor per la procedura di salvataggio, prendo tutte le label e le salvo in una lista.
      Se vuoi che i dati nuovi si aggiungano ai vecchi allora dovrai usare un comando di add to list quando l'utente preme salva, per preparare la tua lista con tutti i dati e solo quando lo hai fatto procedere al salvataggio.
      Forse ho commesso qualche errore ma così a livello testuale è un pò difficile da spiegare, puoi provare a postare quel che hai fatto (con le immagini dei blocchi) nel forum, così magari io ed altri ci diamo un'occhiata
      al momento non prevedo di ampliare questo tutorial, cmq ti ringrazio per l'idea :)

      Elimina
    4. =D Gentilissimo Seb =D
      A dirti il vero, avevo aggirato il problema del database in un'altra app, inserendo all'interno del block editor i nomi nelle text ed all'interno delle make list.. Però sai che casino? =( Avevo una lista con cinque regioni, e nel block editor avevo fatto cinque if, uno per regione. Con 10 spazi per le textbox, nell'if della Calabria avevo posizionato il testo "Reggio Calabria" nella prima textbox, Catanzaro nella seconda e così via, inserendo il testo vuoto nei box 6,7,8,9 e 10 (le province calabresi sono solo 5). Nulla vietava però, una volta selezionata la Calabria, di rendere invisibili le textbox rimaste vuote (6,7,8,9 e 10). Stessa cosa per le altre regioni ;) Cioè così facendo, i dati sono salvati proprio nel block editor, che funge dunque da database. Però ora voglio fare questo piccolo "salto di qualità", prendendo di petto il TinyDB =D
      Proverò a fare come mi hai consigliato tu..

      Ps: oggi ti sto proprio rompendo, me ne dispiace.. =( Ma vorrei capire meglio il legame tra il list picker che vado ad inserire nel progetto e il tag che mi ritrovo nel block editor: c'è una relazione tra la regione scelta nel list picker e il tag del TinyDB?

      Ps2: provo subito a fare come hai detto tu, smanetto un pochettino e poi ti faccio sapere =)

      Elimina
    5. ti rispondo per quanto riguarda il primo "ps":
      il listpicker vuole una lista di valori separati da virgole, questi sono gli elementi che poi visualizzerai nel LP stesso.
      nel TinyDB puoi salvare qualsiasi tipo di dato testuale, quindi o una sola stringa, o una lista, o un array, tanto sono sempre scritti sotto forma testuale
      Il tag è solo il nome con cui vuoi "chiamare" la variabile che leggi o scrivi nel TinyDB perchè il TinyDB è un entità dove memorizzi i dati sotto forma di coppie Tag-Valore
      Ad esempio puoi memorizzare nel TinyDB un tag chiamato "regioni" dove metti una lista delle regioni italiane separate da una virgola,
      poi se usi un listpicker e gli dai come elementi questa lista visualizzerai il classico LP con l'elenco completo delle regioni, e quando l'utente ne sceglie una avrai come risposta sia la posizione di questa nella lista (index) che l'elemento scelto , starà poi a te vedere cosa ti conviene utilizzare e come,
      spero di averti schiarito ancora un pò le idee :)

      Elimina
    6. Caro Sebastiano,
      ti scrivo per comunicarti che ho finito la piccola app di cui ti parlavo!! L'inghippo stava nel tag e nei valori.. o almeno per me che non avevo ancora capito il concetto.. Avevo afferrato una cosa però, che il tag funzionava da "nome" della regione. Ho creato una lista (scegli regione) nella parte iniziale del progetto, e una text box: ogni volta che seleziono una regione, viene inserito automaticamente il nome nella text box. Il testo di questa text box, nel block editor, lo dò in pasto al tag del tiny, in modo da creare un tag variabile a seconda della regione scelta.. Non ho avuto bisogno di ulteriori sforzi, lista di liste o altro.. E' stata una bella scoperta, che per dire la verità avevo male intuito: nelle prove, infatti, usavo una label invece del text box, e non mi funzionava nulla.. Mi sembrava corretta come cosa, perché il nome della regione lo passavo difatti nella label, ma forse avrò commesso qualche piccolo errore che mi danneggiava il tutto..
      Come risultato, se scelgo Calabria ho l'elenco delle province calabresi, nella Puglia quelle pugliesi e nella Basilicata quelle lucane. Serviva capire il funzionamento, quindi il lavoro l'ho fatto con queste sole, però ho capito che aggiungendo la nuova regione il discorso fila, basta aggiungere anche le posizioni da dare alle province (per adesso ho lavorato con un numero basso di province) sennò si crea confusione..
      Non ho ancora comparato questa app all'app della spesa, con qualche modifica dovrei riuscire a creare un database almeno settimanale della spesa :) è già un qualcosa :P

      Che dire, senza il tuo aiuto e la tua passione non ci sarei mai riuscito in questo =) Non so come ringraziarti =)
      Però, se per puro caso fai un salto a Reggio Calabria e me lo fai sapere, sappi che hai gelato e pizza pagati ;) =D

      Un caro abbraccio e alla prossima!!!! =DDD

      Elimina
  57. Un grande apprezzamento a Sebastiano per i suoi tutorial.
    Io sono nuovo e stò imparando adesso ad usare App Inventor e i tutorial mi sono indispensabili.
    Ho un problema !
    Lo posto qui perchè riguarda questo tutorial, se ho sbagliato riprendetemi.
    Ho provato il programmino e mi dava un errore.
    Allora ho scaricato i sorgenti da qui e ho provato quellì sul dispositivo virtuale .
    STESSO ERRORE all'avvio ! : Bad argument to is list empty? The operation is list empty? cannot accept the arguments: *empty string*. Non capisco dove ho sbagliato.
    Grazie

    RispondiElimina
    Risposte
    1. Grazie! mi hai aiutato a trovare un errore, forse con delle versioni successive di App Inventor han cambiato leggermente il funzionamento di alcuni blocchi, e infatti "is list empty" ora ritorna un errore se il dato non è formattato come una lista (ed in effetti al lancio dell'applicazione non lo è)
      per risolvere la cosa semplicemente puoi cambiare il blocco
      "is list empty" con
      "is text empty"
      in questo modo al primo lancio dell'app quando il TinyDb è vuoto, non proverà ad impostare le textbox con i valori nulli e non ti darà più questo errore,
      ora correggo anche il post! grazie ancora per avermelo fatto notare (son passati più di due anni da quando ho fatto questo tutorial!)

      Elimina
    2. Anzi grazie a te per la rapidissima risposta !
      Ho fatto la correzione che mi hai proposto, e a volte funziona a volte no, restituendo un messaggio di errore del tipo dati non validi.
      Mi pare di capire che il caricamento di un database non precedentemente creato, restituisce degli errori imprevedibili che, a volte, vanno ad invalidare le liste così da causare i messaggi di errore.
      Ho visto anche che tale problematica si presenta anche per il TinyWebDb.
      Si tratta probabilmente di un bug, ma credo anche causato dal fatto che non c'è ( o meglio io non lo conosco ) un'istruzione in grado di verificare se è già presente un file con quel nome del tipo:" c'è un file con quel nome, altrimenti crealo". ( cose da vecchio programmatore )
      Mi interesserebbe anche sapere come è possibile trasferire dati da un'app all'altra senza passare per il web.
      Grazie

      Elimina
    3. Non è proprio così, il problema è se fai lavorare un qualsiasi componente che lavora su una lista non gli dai come dato una lista,
      il TinyDB quando è inizializzato contiene il valore ovvero una stringa vuota, bisogna controllare questa condizione.
      Ovvero come ho detto con "is text empty" puoi controllare se il tag che leggi con TinyDB è vuoto o meno,
      e quindi procedere al caricamento dei dati solo se il risultato della lettura da TinyDB è diverso da
      Sono due le occorrenze di "is list empty" da sostituire, magari te ne hai sostituita una sola?
      Ad ogni modo rivendendo il video ho visto che li invece avevo fatto il controllo con "lenght" e caricavo i dati solo se la lettura dal TinyDB mi riportava un dato di lunghezza superiore a 0, anche questo è un modo valido per controllare se c'è qualcosa nel TinyDB appena caricato.
      Spero di averti chiarito le idee, ad ogni modo a me non risulta ci sia alcun bug in questi componenti, a volte siamo solo noi che non li usiamo nel modo corretto :)

      Elimina
  58. Innanzi tutto grazie mille per i tuoi tutorial, sei così chiaro che tutti i professori universitari dovrebbero essere come te!
    Io ho un problema simile a quello di Marco, sto creando un'applicazione con diverse pagine, con passaggio di dati da una pagina all'altra, ecc ecc, insomma una cosa abbastanza elaborata.
    Il mio problema credo sia riguardo il caricamento dei dati durante lo screen_initialize, una pagina non ne vuole sapere, mi dà ogni volta che avvio un errore "bad arguments to checked the operation checked cannot accept the arguments: *empty_string*.

    In pratica io per salvare queste checkbox (sono ben 17 sulla pagina) ho fatto per ogni checkbox:
    when checkbox1.changed --> call tinydb store value --> checkbox1
    --> checkbox1.checked
    In più ho fatto una variabile con una lista di tutte le checkbox.checked e salvo anche quella
    Per caricare i dati invece:

    when screen1.initialize
    if--> lenght-checkbox_checked--> >0 (checkbox_checked è il nome della variabile che racchiude tutte le checkbox)
    set--checkbox1.checked-->call.tinydb.getvalue-->checkbox_1

    a questo punto dato l'errore che mi restituisce, mi sembra di capre che l'errore sia sul salvataggio o sul caricamento delle checkbox.
    Cosa posso fare? Spero di essere stato chiaro. Ah l'errore me lo dà solamente la prima volta che avvio l'applicazione, se premo tasto indietro del telefono, evitando di chiudere l'applicazione, funziona tutto bene, e addirittura salvando e chiudendo il programma (lo chiudo anche dal background), questo quando si riavvia non restituisce più l'errore. Quindi che cos'è che ho sbagliato? Grazie mille

    RispondiElimina
    Risposte
    1. Ok ho risolto! in pratica ho cambiato tutta la tipologia di salvataggio delle checkbox. Ho impostato una variabile che divanta 1 quando un checkbox è segnato, salvo quei dati.
      durante lo screen initialize, imposto che se la lista delle variabili è >0 parte il caricamento (evitando gli errori) e imposto a true il checked.

      Elimina
    2. Ciao ho elaborato una app per la domotica basata sostanzialmente sul on_off delle checkbox. il mio problema sostanzialmente è che non riesco in alcun modo a capire come salvare lo stato delle checkbox e renderlo permanente una volta premuto il tasto indietro. puoi darmi qualche dritta?
      grazie

      Elimina
  59. Esite un modo per implementare la lista di una listsPicker importando un file xml alcuni tag del quale saranno i valori della lista e cliccando su uno di questi in una label venga scritto il valore del tag dello stesso xml all'indice passato?
    Spero di essere stato chiaro.
    Complimento per quello che fate

    RispondiElimina
    Risposte
    1. Si, è possibile.
      Il componente Listpicker vuole una lista di valori in csv (quindi separata da virgole)
      Con il componente web leggi il tuo file xml, estrai i valori che ti interessano (per il listpicker) e li formatti in csv (qui dipende molto dal tuo file xml, da come è scritto e formattato)
      Una volta che è in csv lo usi come elementi per il Listpicker,
      poi quando l'utente fa la sua scelta hai il valore scelto che sarà anche il nome del tag con cui andrai a fare l'estrazione del valore relativo nel file xml.
      A parole un pò difficile da spiegare ma il concetto dovrebbe essere questo :)

      Elimina
  60. Ciao Ragazzi, a me succede una cosa incredibile e vi ringrazio se riuscirete ad aiutarmi.
    Sto sviluppando la mia app e sto facendo delle prove ma, oltre ad avere un emulatore super lento non risponde ai comandi. Mi spiego meglio ho lanciato l'app e mi mostra a video i dati prelevati da un Db creato con le FusionTables, ma adesso anche se rimuovo la stringa di connessione o cambio la query mi mostra sempre gli stessi dati ovvero tutta la tabella? Forse non lo so, ma esiste una cache dell'emulatore?

    RispondiElimina
  61. Ciao Sebastiano, io sinceramente non so più come risolvere con il salvataggio dati in TinyDb, o creato una piccola e semplice applicazione,in se funziona tutto , solo che quando spengo e riaccendo il cell non mi restano i dati memorizzati ,sicuramente sbaglio qualcosa nel tinyDB , potresti dargli un occhiata gentilmente ed in caso modificarla in modo che funzioni il salvataggio dati ? Lascio il link del file zip in modo che chiunque possa vedere e dargli un occhiata e lascio anche la mia email cosi da inviarmi il file corretto...
    Grazie a tutti
    Questa e l'applicazione
    https://www.dropbox.com/s/h9z4pg1ssmqk61y/Inventario_demo_copy1.zip
    La mia email e zannabianca74@hotmail.com

    RispondiElimina
  62. Ciao Seba, sto realizzando un app che all'interno contiene alcune immagini in vari screen. Queste immagini iniziano ad incidere sulla grandezza dell'app. Avevo pensato se è possibile realizzare tipo un tasto "scarica dati"( che si vada a collegare al web) alla prima apertura dell'applicazione e che scarichi queste immagini e le vada a salvare questi dati all'interno del dispositivo?

    Grazie e complimenti per tutto.

    RispondiElimina
    Risposte
    1. Puoi utilizzare sempre il componente web per salvare le tue immagini nel dispositvo,
      guarda questo semplice tutorial:
      http://puravidaapps.com/filedownload.php
      poi starà a te caricare i file dalla memoria del telefono facendo attenzione che i file siano stati effettivamente caricati

      Elimina
    2. Lo provato ed è proprio quello che mi serviva. solo adesso ho un altro problema, questa applicazione e multi screen quindi io vorrei scaricare tutte le immagini con un tasto sulla screen principale per poi richiamarmi le immagini scaricate ogni una nella loro screen è possibile fare questa cosa? Inoltre ho notato che ogni volta che apro l'app devo far scaricare l'immagine, non è possibile farlo solo "al primo avvio dell'applicazione"?

      Elimina
  63. ci provo a scrivere. quando uso tinydb per memorizzare dati e gli passo tag e testo, va tutto bene ma se in sequenza gli passo tag(a) e testo, tag(b) e testo, tag(c) e testo e poi gli ripasso tag(a) e newtesto mi sovrascrive il valore precedente nel tag(a) o mi sbaglio? se mi sbaglio come faccio a richiamare il tag(a) e vedere i due valori?

    RispondiElimina
    Risposte
    1. Certo, l'operazione di scrittura sovrascrive il dato precedente quando usi lo stesso tag.
      Se vuoi "aggiungere" ad un tag, allora prima devi leggere il tag, lo memorizzi in una variabile locale e poi scrivi il nuovo valore del testo nello stesso tag, magari con una make a list, in modo da salvare in una lista il testo 1 e il testo 2.
      Insomma dipende da come vuoi implementare i tuoi dati, però come hai giustamente detto l'operazione di scrittura sovrascrive tutto quello pre-esistente nel dato tag.
      Buon app inventing! :)

      Elimina
  64. Ciao complimenti per tutti i tuoi tutoria mi sono stati molto utili e vorrei farti una domanda inerente al tutorial del salvataggio. ho necessita di salvare il cambio di stato delle caselle di testo una volta premuto il pusante torna indietro mi sai dare qualche dritta? grazie

    RispondiElimina