Ripartiamo da quanto avevamo fatto nel Tutorial 53 per il salvataggio di una base dati da utilizzare nella nostra App.
Andremo a vedere in questo tutorial come sia possibile cercare dei dati specifici all'interno dei dati che avevamo salvato nel TinyDB sotto forma di lista bidimensionale.
Come infatti potete immaginare, il bello di avere una gran mole di dati (supponiamo appunto un intero elenco telefonico), è quello di poter ricercare un valore particolare all'interno di essi con facilità.
Nell'esempio di oggi vedremo come è possible cercare se nel nostro elenco è presente un particolare "cognome" ed estrarre tutti i dati ad esso relativi, quindi il relativo "nome" ed il "numero di telefono".
Con poche modifiche potrete cercare con un altra "chiave" ovvero magari per "nome" o per "numero di telefono", le possibilità di impiego di questi concetti sono infinite e stanno alla base di qualunque linguaggio di programmazione.
Android App Inventor ci mette a disposizione vari componenti che servono al nostro scopo, il più interessante come visto l'altra volta è il:
foreach
(si trova nella palette "Control") e permette di "scandagliare" con semplicità tutti gli elementi di una lista.
La volta scorsa lo avevamo utilizzato semplicemente per stampare a video tutti gli elementi contenuti nel nostro TinyDB, questa volta invece lo useremo per ricercare il nostro elemento (il "cognome" in questo caso) tra tutti i cognomi registrati nella nostra App.
Per farlo dobbiamo anche usare il metodo
is in list?
(si trova nella palette "Lists")
che controlla se per caso l'elemento che passiamo in "thing" sia contenuto nella lista "list"
Sempre facendo riferimento ai blocchi visualizzati qui sopra vedete come la "foreach" prenda in esame un elemento alla volta della nostra lista bidimensionale, quindi se tutta la lista "DB_Rubrica" contiene ad esempio questi valori:
((Sebastiano Bianchi 021111) (Riccardo Rossi 025555) (Giovanni Rossini 028888) (Giuseppina Greco 0812222))
Al primo ciclo di esecuzione della "foreach" il valore corrente di DB_RubricaElement2 sarà pari a
(Sebastiano Bianchi 021111)
Con una condizione "if" controlliamo quindi se il Cognome inserito nella TextBox "Tb_RicCognome" è per caso contenuto nella lista (ora monodimensionale e composta da 3 elementi) "DB_RubricaElement2".
In caso affermativo usiamo la make text per stampare a video il record con tutti i dati relativi al cognome appena cercato (più alcuni altri valori che spiego meglio nel video).
Potete scaricare il sorgente di questa applicazione cliccando QUA
Dopo il video vediamo nel dettaglio come sia possibile effettuare la ricerca anche in un'altra maniera (ignorando eventuali spazi e maiuscole minuscole nella nostra TextBox)
Un altro possibile metodo per controllare se il dato da noi ricercato è presente nella lista bidimensionale attualmente in uso è quello di utilizzare la funzione di ricerca testuale (presenti quindi nella palette "Text") chiamata:
contains
Questo blocco controlla se il testo inserito nel parametro "piece" è contenuto nell'elemento "text" e se lo è ritorna il valore "true".
Usandolo in abbinata ad altri due elementi della palette "Text" chiamati
downcase e trim
Possiamo ricercare anche delle corrispondenze parziali (quindi ad esempio se cerco "rossi" mi trova anche chi di cognome fa "rossini"),
in più utilizzando downcase possiamo ignorare il fatto che l'utente abbia usato maiuscole o minuscole nella textbox e con trim possiamo ignorare eventuali spazi vuoti prima o dopo il testo (quindi ad esempio se cerco "rossi " - notate lo spazio alla fine di "rossi " , mi trova lo stesso tutti i cognomi "rossi" presenti nel DB)
Ovviamente il programma qui realizzato si presta a mille correzioni ed ottimizzazioni, questo vuole essere solo un esempio semplice e rapido di come si possono ricercare dei dati all'interno delle liste, in maniera semplice ed efficiente.
Per ogni commento, usate il forum, il blog, i commenti su youtube e tutti i soliti canali a vostra disposizione!!!
Ciao a tutti sopratutto a Seb. :)
RispondiEliminaho un piccolo problemino con foreach
https://drive.google.com/file/d/0BxngC48G-rM4WlAzaVFfSXBWSUU/edit?usp=sharing
come potete vedere dall'immagine :) : qui sopra elencata carico la label "risultatoricerca.text" con il risultato del Foreach
ma non capisco perkè il risultato nella label indicata è formata da due stringhe cioè: Smalto rosso - smalto Blu
ma nel DbClassificament me ne carica uno in questo caso smalto blu 254
se era possibile capire dove erro e perkè non immette nel db sia il "smalto Rosso"?
Ciao Seb e complimenti per tutto!!
RispondiEliminaAvrei una richiesta, visto che app inventor classic è molto diverso da app inventor 2 ( quello he uso ora io) mi trovo un po in difficoltà con le liste.
MI spiego meglio:
Nel tuo tutorial per creare l'Array( rigo della rubrica ) usi Make a list a poi add item to list.
IN ap2 deve fare "Add items to list " e qui se metto diversi ITEMS lui non mi crea un rigo ma inserisce solo un valore alla fine della lista. Per evitare ciò ho usato una JOIN su singolo Item creando quindi una stringa, ma facendo ciò ho poi problemi con gli spazi all'interno della riga e per la ricerca del testo nella "for EACH".
Come posso risolvere ?? O magari non potresti rifare il tutorial per la versione di App inventor ". GRAZEEEEEE!!!!
Ciao Seb sei un fenomeno. Complimenti per il blog.
RispondiEliminaHo dei problemi con le liste con il componente listwiew.
Come si fa a focalizzare un elemento specifico della lista? Ad esempio quando si apre la listwiew vorrei il focus sull'ultimo elemento della lista o su un elemento specifico magari di una variabile.
Poi, quando uso il filtro "search" vorrei creare una nuova lista con gli elementi filtrati ma non è possibile. cosi sono costretto a fare i soliti cicli...for each...ecc.
grazie.
Ciao Sebastiano,
RispondiEliminavolevo chiederti un aiuto sul tema in oggetto. In un applicazione che ho creato carico le provvigioni, di ogni singolo mese, in una lista. Ora mi serve un metodo per richiamare in una label la somma di queste provv sempre in base al mese selezionato. Avevo pensato che, selezionando il mese di interesse, richiamavo ogni singola index in label diversi così, con la funzione della somma, ricavo la siomma delle varie label. Ora tutto potrebbe andare bene fino a che i valori sono tutti registrati, se però richiamo un valore di un index non registrato mi da errore. Cosa posso fare per evitare questo errore? Oppure se puoi consigliarmi un metodo diverso per sommare i valori presenti nelle lista.
Grazie Marcello