ݺߣ

ݺߣShare a Scribd company logo
TEMA 10 1/21 
CrearQuestionari i ContestarQuestionari 
L'aplicació “El Gran Concurs del Presidents” en el tema 8 
es pot personalitzar per construir qualsevol prova, però la 
personalització es limita als programadors de App 
Inventor. Només tu, com a programador, pot modificar 
les preguntes i respostes, i no hi ha manera que els 
pares, mestres, o altres usuaris d'aplicacions per crear 
els seus propis qüestionaris o canviar les preguntes de 
l'examen (a menys que ells també vulguen aprendre a 
utilitzar App Inventor! ). 
En aquest tema, construiràs una aplicació que permet a 
un “mestre” crear qüestionaris utilitzant un formulari 
d'entrada. Les preguntes de l'examen i respostes 
s'emmagatzemen en una base de dades de manera que "els estudiants" poden 
accedir a una aplicació separada per a fer l'examen. En la construcció d'aquestes 
dues aplicacions, podràs fer un altre salt conceptual significatiu i aprendre a crear 
aplicacions amb les dades generades per l'usuari que es comparteix entre les 
aplicacions i els usuaris. 
CrearQuestionari i ContestarQuestionari són 
dues aplicacions que funcionen en tàndem i 
permet que un "mestre" cree qüestionaris per a 
un "estudiant." Els pares poden crear 
aplicacions divertides i curioses per als seus fills 
durant un llarg viatge per carretera,els 
professors de primària poden construir proves 
de matemàtiques, i en la universitat els 
estudiants poden construir proves per ajudar 
els seus grups d'estudi per preparar un examen 
final. Aquest tema es basa en “El Gran Concurs 
del Presidents” del tema 8, de manera que si no 
ha completat aquesta aplicació, has de fer-ho 
abans de seguir aquí. Vas a dissenyar dues 
aplicacions, CrearQuestionari per al "mestre" 
(veure Figura 10-1) i ContestarQuestionari per 
al estudiant. Amb CrearQuestionari: 
Figura 10-1. L'aplicació CrearQuestionari 
• L'usuari introdueix preguntes i respostes en un formulari d'entrada. 
• Les parelles entrades pregunta-resposta es mostren. 
• Les preguntes i respostes de l'examen s'emmagatzemen en una base de 
dades. 
ContestarQuestionari funcionarà de manera similar a l'aplicació “El Gran Concurs del 
Presidents” que ja has construït. De fet, crearàs aquesta aplicació utilitzant “El Gran 
Concurs del Presidents” com a punt de partida. ContestarQuestionari es diferència 
en que les preguntes seran les que es van introduir a la base de dades utilitzant 
CrearQuestionari.
TEMA 10 2/21 
El que aprendràs 
El Gran Concurs de Presidents va ser un exemple d'una aplicació amb dades 
estàtiques: no importa quantes vegades fas la prova, les preguntes són sempre les 
mateixes, ja que s'escriuen com a part de l'aplicació. Aplicacions de notícies, blocs, i 
aplicacions de xarxes socials com Facebook i Twitter treballen amb dades 
dinàmiques, el que significa que poden canviar amb el temps. Sovint, aquesta 
informació és genera dinàmicament pels usuaris, l'aplicació permet als usuaris 
introduir, modificar i compartir informació. Amb CrearQuestionari i 
ContestarQuestionari, aprendràs com construir una aplicació que s'encarrega de les 
dades generades per l'usuari. 
Si has completat l'aplicació del xilòfon (tema 9), ja has estat introduït en les llistes 
dinàmiques; en aquesta aplicació, les notes musicals que l'usuari toca es registren 
en les llistes. Aplicacions amb les dades generades per l'usuari són més complexes, i 
els blocs són més abstractes, ja que no es basen en les dades predefinides i 
estàtiques. Es defineix la variable llista, però sense definir elements específics. En 
programar la seva aplicació, cal preveure les llistes que s'omplen amb les dades 
introduïdes per l'usuari final. 
Aquest tutorial cobreix els conceptes d'App Inventor següents: 
• Els formularis d'entrada per permetre que l'usuari introdueixi informació. 
• Mostrar elements de diverses llistes. 
• Dades persistents: CrearQuestionari salvarà les preguntes i respostes de 
l'examen en una base de dades web, i ContestarQuestionari les carregarà des 
de la mateixa base de dades. 
• Intercanvi de dades: podràs emmagatzemar les dades en una base de dades 
web utilitzant el component TinyWebDB (en lloc del component TinyDB 
utilitzat en temes anteriors). 
Introducció 
Connectar-se a la pàgina web d'App Inventor i començar un nou projecte. El nom de 
"CrearQuestionari" i establir el títol de la pantalla de "CrearQuestionari". Obri l'Editor 
de blocs i connectat al teu telèfon.
TEMA 10 3/21 
Disseny dels components 
Utilitzeu el Dissenyador de components per crear la interfície de CrearQuestionari. 
En acabar, s'hauria d'assemblar a la Figura 10-2 (també hi ha instruccions més 
detallades després de la instantània). 
Pots construir la interfície d'usuari que es mostra a la Figura 10-2 arrossegant els 
components indicats a la Taula 10-1. Arrossega cada component a la paleta en el 
visor i el nom com s'especifica a la taula. Tingueu en compte que pots deixar els 
noms de les etiquetes de capçalera (Label1 - Label4) com els seus valors per defecte 
(no els utilitzaràs en l'Editor de blocs de tota manera). 
Figura 10-2. CrearQuestionari al Dissenyador de components 
Taula 10-1. Tots els components de l'aplicació CrearQuestionari 
Component Paleta Nom assignat Objectiu 
TableArrangement Screen 
Arrangement 
TableArrangement1 Donar format a la pregunta i la resposta. 
Label Basic Label1 La "Pregunta:". 
TextBox Basic TBPregunta L'usuari introdueix preguntes aquí. 
Label Basic Label2 La "Resposta:". 
TextBox Basic TBResposta L'usuari introdueix respostes aquí. 
Button Basic BEnviar L'usuari fa clic en aquest per presentar un parell de 
Preguntes i Respostes. 
Label Basic Label3 Mostra prova "Preguntes i Respostes". 
Label Basic EtPreguntesRespostes Mostra els parells Preguntes-Respostes introduïts 
anteriorment. 
TinyWebDB No està preparat 
per a la primera 
vegada. 
TinyWebDB1 Emmagatzemar dades, per a recuperar-les més 
tard.
TEMA 10 4/21 
Establir les propietats dels components de la següent manera: 
1. Establir el text de Label1 a "Pregunta", el text de Label2 a "Resposta", i el text 
de Label3 per "Preguntes i Respostes". 
2. Estableixi la Grandària de Lletra de Label3 a 18 i marqui la casella FontBold. 
3. Ajusteu el TBPregunta a "Introdueix una pregunta" i el de TBResposta a 
"Introdueix una resposta". 
4. Establir el text de BEnviar a "Enviar". 
5. Establir el text de EtPreguntesRespostes a "Preguntes i Respostes". 
6. Moveu el TBPregunta, TBResposta, i les seves etiquetes associades a 
TableArrangement1. 
Afegir comportaments als Components 
Igual que amb l'aplicació “El Gran Concurs del Presidents”, primer definir algunes 
variables globals per a la LlistaPreguntes i LlistaRespostes, però aquest cop no ens 
proporcionarà preguntes i respostes fixes. La Taula 10-2 enumera els elements que 
necessitarà per definir les llistes. 
Taula 10-2. Blocs per a la definició de la pregunta i la resposta llistes 
Tipus de Bloc calaix Propòssit 
def variable ("LlistaPreguntes") Definitions Definiu la variable LlistaPreguntes. 
def variable ("LlistaRespostes") Definitions Definiu la variable LlistaRespostes. 
make a list Lists Configureu la LlistaPreguntes de nous temes. 
make a list Lists Configureu la LlistaRespostes de nous temes. 
Els blocs han de ser com es mostra a la Figura 10-3. 
Figura 10-3. Les llistes per CrearQuestionari 
Tingueu en compte que, a diferència de l'aplicació “El Gran Concurs del Presidents”, 
les llistes es defineixen sense elements en les ranures. Això és perquè amb 
CrearQuestionari i ContestarQuestionari, totes les dades seran creats per l'usuari de 
l'aplicació (és dinàmica, les dades generades per l'usuari).
TEMA 10 5/21 
Enregistrament de les entrades de l'usuari 
El primer comportament que construïm és per controlar l'entrada de l'usuari. En 
concret, quan l'usuari introdueix una pregunta i resposta i fa clic en enviar, fareu 
servir afegir l'element a la llista de blocs per actualitzar el LlistaPreguntes i 
LlistaRespostes. La Taula 10-3 enumera els elements que necessitarà. 
Taula 10-3. Blocs per registrar les entrades de l'usuari 
Tipus de Bloc Calaix Objectiu 
BEnviar.Click BEnviar S'activa quan l'usuari fa clic en aquest botó. 
add items to list (2) Lists Afegiu les dades que l'usuari introdueix per les llistes. 
global LlistaPreguntes My Definitions Connecteu està en la ranura de "llista" del primer bloc 
add items to list. 
TBPregunta.Text TBPregunta Entrada d'usuari, enganxa està en la ranura "element" 
dels primer bloc add items to list. 
global LlistaRespostes My Definitions Connecteu està en la ranura “llista” del segon bloc add 
items to list. 
TBResposta.Text TBResposta Entrada d'usuari, enganxa està en la ranura "element" 
dels segon bloc add items to list. 
set EtPreguntesRespostes.Text to EtPreguntesRespostes Mostra les llistes actualitzades. 
make text Text Construeix un objecte de text amb dues llistes. 
global LlistaPreguntes My Definitions Les preguntes. 
text (:) Text Col·loqueu dos punts entre les llistes. 
global LlistaRespostes My Definitions Les respostes.
TEMA 10 6/21 
Com funcionen els blocs 
El bloc add items to list annexa, o afegeix, cada element al final d'una llista. Com es 
mostra a la Figura 10-4, l'aplicació pren el text que l'usuari ha introduït en les caixes 
de text TBPregunta i TBResposta i annexa a cada una la llista corresponent. 
Els blocs add items to list actualitza les variables LlistaPreguntes i LlistaRespostes, 
però aquests canvis encara no es mostra a l'usuari. La tercera fila de blocs mostra 
aquestes llistes mitjançant la concatenació d'elles (fer el text) amb dos punts al mig. 
Per defecte, App Inventor mostra llistes amb parèntesis que envolten i els espais 
entre els elements d'aquesta manera: (item1 item2 elemento3). Per descomptat, 
aquesta no és la forma ideal per mostrar les llistes, sinó que li permetrà posar a 
prova el comportament de l'aplicació per ara. Més tard, crearem un mètode més 
sofisticat de mostrar les llistes que apareixen cada parell de preguntes i respostes 
en una línia separada. 
Figura 10-4. Afegint les noves entrades a la llista 
Posa a prova la teva app. Al telèfon, escriviu una pregunta i la 
resposta i feu clic al BEnviar. L'aplicació ha de mostrar la sola entrada 
a la LlistaPreguntes, dos punts, i després l'única entrada de la 
LlistaRespostes. Afegir una segona pregunta i la resposta a assegurar-se 
que les llistes es creen correctament.
TEMA 10 7/21 
Netejant les preguntes i respostes 
Com es recordarà des de l'aplicació “El Gran Concurs del Presidents”, quan va 
passar a la següent pregunta a la llista, és necessari per ocultar els resultats de les 
respostes de la pregunta anterior. En aquesta aplicació, quan un usuari envia un 
parell de preguntes i respostes, voldràs esborrar les caixes de text TBPregunta i 
TBResposta perquè estiguin llestos per a una nova entrada en lloc de mostrar 
l'anterior. Per això, afegiu els blocs que figuren en la taula 10-4 a la part inferior del 
controlador d'esdeveniments BEnviar.Click. 
Taula 10-4. Blocs per quedar-se en blanc la pregunta i caselles de resposta de text 
Tipus de Bloc Calaix Objectiu 
set TBPregunta.Text to TBPregunta En blanc la pregunta. 
set TBResposta.Text to TBResposta En blanc la resposta. 
text (two blank ones) Text Reemplaci TBPregunta i TBResposta. 
Com funcionen els blocs 
Quan l'usuari envia una nova pregunta i resposta, que s'afegeixen a les seves 
respectives llistes i es mostra. En aquest punt, el text al TBPregunta i TBResposta es 
queda en blanc amb blocs de text buits, com es mostra a la Figura 10-5. Tingueu en 
compte que pot crear un bloc de text buit fent clic al text dins del bloc i prémer 
Elimina. 
Figura 10-5. Netejant les caixes de text de pregunta i resposta després de la presentació
TEMA 10 8/21 
Posa a prova la teva app. Afegiu algunes preguntes i respostes. Cada 
vegada que envieu un parell, el TBPregunta i TBResposta ha de ser netejat; 
només la pista apareix (per exemple, "Introdueix una pregunta "). 
Veient parells pregunta-resposta en diverses línies 
En l'aplicació que s'ha construït fins ara, les llistes de preguntes i respostes es 
mostren per separat i amb el format predeterminat de visualització de la llista de 
App Inventor. Així que, si estàs fent un examen sobre capitals dels estats i havia dos 
parells de preguntes i respostes, podria semblar així: 
(Quina és la capital de Califòrnia? Quina és la capital de Nova York? Sacramento 
Albany) 
Com es pot imaginar, si algú crea una prova bastant llarg, pot ser bastant complicat. 
Una millor visualització es mostrar cada pregunta amb la seva resposta 
corresponent, amb un parell de preguntes i respostes per línia com aquesta: 
Quina és la capital de Califòrnia: Sacramento 
Quina és la capital de Nova York: Albany 
La tasca aquí és una mica més complicada, ja que està tractant amb dues llistes. La 
causa de la seva complexitat, posaràs els blocs en un procediment anomenat 
MostraPRs, i cridaràs a aquest procediment des del controlador d'esdeveniments 
BEnviar.Click. 
Per mostrar els parells pregunta-resposta en línies separades, hauràs de fer el 
següent: 
• Utilitzeu un bloc foreach per iterar a través de cada pregunta a 
LlistaPreguntes. 
• Utilitzeu una variable RespostaIndex de manera que pots prendre cada 
resposta a mesura que itera a través de les preguntes. 
• Utilitzeu make text per a construir un objecte de text amb cada parella 
pregunta i resposta, i un caràcter de nova línia (n) que separa cada parella. 
Necessitaràs els elements llistats a la Taula 10-5.
TEMA 10 9/21 
Taula 10-5. Blocs per mostrar les parelles pregunta-resposta en línies separades 
Tipus de Bloc Calaix Propòssit 
to procedure ("MostraPRs") Definition Aquest procediment és un bloc que tanca tots els 
altres blocs. 
def var ("Resposta") Definition Emmagatzemar temporalment cada resposta. 
def var ("RespostaIndex") Definition Mantingui un registre de la resposta (i la 
pregunta) que l'usuari està connectat. 
text ("text") Text Inicialitzeu la variable Resposta a text. 
number (1) Math Inicialitzeu la variable RespostaIndex to 1. 
set EtPreguntesRespostes.Text to My Definitions Inicialitzar l'etiqueta a buid. 
text ("") Text Connectar-ho a set EtPreguntesRespostes.Text 
to. 
set global RespostaIndex to My Definitions Restableix RespostaIndex cada vegada que 
MostraPRs es cridada. 
number (1) Math Restableix RespostaIndex a 1. 
foreach Control Recorrer la LlistaPreguntes. 
name question (Apareix com un 
argument de foreach, el 
nom per defecte és var.) 
Canvieu el nom de la variable foreach de 
marcador de posició a question. 
global LlistaPreguntes My Definitions Connecteu esta en la ranura “llist” de foreach. 
set answer to My Definitions Establiu aquesta variable cada vegada al 
foreach. 
select list item Lists Seleccioneu a la llista LlistaRespostes. 
global LlistaRespostes My Definitions Connecteu està en la "llista" de la ranura select 
list item. 
global RespostaIndex My Definitions Connecteu aquesta al "índex" de la ranura select 
list item. 
set global RespostaIndex to My Definitions Incrementar l'índex en cada iteració del bucle. 
+ Math Incrementar RespostaIndex. 
global RespostaIndex My Definitions Connecteu aquesta en +. 
number (1) Math Connecteu aquesta en +. 
set EtPreguntesRespostes.Text to EtPreguntesRespostes Mostrar les QA. 
make text Text Construir cada parell QA. 
EtPreguntesRespostes.Text EtPreguntesRespostes En iterar, afegiu cada nou parell dels anteriors. 
text ("n") Text Col·loqueu una nova línia entre parells. 
value question My Definitions Aquest és el marcador de posició del foreach, és 
la pregunta actual que estem processant. 
text (":") Text Col·loqueu dos punts entre la pregunta i la 
resposta. 
global answer My Definitions La resposta actual.
TEMA 10 10/21 
Com funcionen els blocs 
El bloc MostraPRs encapsula tots els blocs per mostrar les dades, com es mostra a la 
Figura 10-6. Mitjançant l'ús d'un procediment, no tindrem els blocs de la pantalla 
més d'una vegada en l'aplicació, i només podem cridar MostraPRs quan hem de 
mostrar les llistes. 
Figura 10-6. El procediment MostraPRs 
El foreach només li permet recórrer una llista. En aquest cas, hi ha dues llistes, i cal 
seleccionar cada resposta a mesura que avança a través de les preguntes. Per 
aconseguir això, utilitzarem una variable d'índex, com ho vam fer amb l'Índex de 
PreguntaActual en el tema 8. En aquest cas, la variable d'índex, RespostaIndex, 
s'utilitza per rastrejar la posició en la LlistaRespostes com el foreach passa a través 
de la LlistaPreguntes. 
RespostaIndex es posa a 1 abans que el foreach comence. Dins el foreach, 
RespostaIndex selecciona la resposta actual de la LlistaRespostes, i després 
s'incrementa. A cada iteració del foreach, la pregunta actual i resposta es concatena 
amb el final de la propietat EtPreguntesRespostes.Text, amb dos punts entre ells.
TEMA 10 11/21 
En trucar al nou procediment 
Ara disposa d'un procediment per a la visualització de les parelles pregunta-resposta, 
però no ajudarà a menys que ho digui quan ho necessiti. Modifiqueu el 
controlador d'esdeveniments BEnviar.Click cridant MostraPRs en lloc de mostrar les 
llistes amb el senzill EtPreguntesRespostes.Text bloc set EtPreguntesRespostes.Text 
to. Els blocs d'actualització haurian d'aparèixer com es mostra a la Figura 10-7. 
Figura 10-7. En cridar al procediment MostraPRs de BEnviar.Click 
Posa a prova la teva app. Al telèfon, afegir unes quantes més 
parelles de pregunta-resposta. La pantalla ha de mostrar cada 
pregunta amb la seua resposta corresponent, amb cada parella de 
preguntes i respostes en una línia separada.
TEMA 10 12/21 
Emmagatzematge de les preguntes i respostes en 
una base de dades 
Fins ara, has creat una aplicació que posa les preguntes i respostes en una llista. 
Però, què passa si l'aplicació CrearQuestionari es tanca? Si has completat el tema 4 
o el tema 7, saps que si no emmagatzema les dades en una base de dades, no seran 
allà quan l'usuari tanca i torna a obrir l'aplicació. L'emmagatzematge de les dades 
de manera constant permetrà que l'aplicació CrearQuestionari puga veure o editar la 
darrera actualització de la prova cada vegada que s'obre. L'emmagatzematge 
persistent també és necessària perquè l'aplicació ContestarQuestionari necessita 
tenir accés a les dades. 
Ja estàs familiaritzat amb l'ús del component TinyDB per emmagatzemar i recuperar 
dades d'una base de dades. Però en aquest cas, utilitzarem el component 
TinyWebDB. Mentre que TinyDB emmagatzema la informació directament en un 
telèfon, TinyWebDB emmagatzema dades en bases de dades que resideixen a la 
web. 
La seua aplicació necessita utilitzar una base de dades en línia en lloc d'una 
emmagatzemada al telèfon d'una persona. La qüestió clau aquí és que estàs 
construint dues aplicacions que necessiten tenir accés a les mateixes dades, si el 
CrearQuestionari emmagatzema les preguntes i respostes en el seu telèfon, els 
ContestarQuestionari no tindrà manera d'arribar a les dades. Com que el TinyWebDB 
emmagatzema dades a la Web, el ContestarQuestionari pot accedir a les preguntes i 
respostes de l'examen en un dispositiu diferent a la de l'examen del 
CrearQuestionari. 
Aquest és l'esquema general per a fer la llista de dades com les preguntes i 
respostes persistents: 
• Guardi una llista a la base de dades cada vegada que un nou element 
s'afegeix a la mateixa. 
• Quan l'aplicació s'inicia, carrega la llista de la base de dades en una variable. 
Iniciar mitjançant l'emmagatzematge de la LlistaPreguntes i LlistaRespostes a 
la base de dades cada vegada que l'usuari entra en una nova parella. Anem a 
afegir els elements que es mostren a la Taula 10-6 per al controlador 
d'esdeveniments BEnviar.Click. 
Taula 10-6. Els blocs per a l'emmagatzematge de les dades a la base de dades 
Tipus de Bloc Calaix Objectiu 
TinyWebDB1.StoreValue TinyWebDB1 Deseu les preguntes de la base de dades. 
text ("Preguntes") Text Connecteu "qüestions" com l'etiqueta de StoreValue. 
global Question List My Definitions Connecteu està en el "valor" de la ranura StoreValue. 
TinyWebDB1.StoreValue TinyWebDB1 Deseu les respostes a la base de dades. 
text ("Respostes") Text Connecteu "respostes" com l'etiqueta de StoreValue. 
global LlistaRespostes My Definitions Connecteu està en el "valor" de la ranura StoreValue.
TEMA 10 13/21 
Com funcionen els blocs 
Els blocs TinyWebDB1.StoreValue emmagatzemen les dades en una base de dades 
web. StoreValue té dos arguments: l'etiqueta que identifica les dades i el valor que 
són les dades reals que vol emmagatzemar. Com es mostra a la Figura 10-8, la 
LlistaPreguntes s'emmagatzema amb una etiqueta de "Preguntes", mentre que el 
LlistaRespostes s'emmagatzema amb una etiqueta de "Respostes". 
No obstant això, per a la teua aplicació, has d'utilitzar etiquetes distintes de 
"Preguntes" i "Respostes" (per exemple, "JosepPreguntes " i "JosepRespostes"). Això 
és important perquè estàs utilitzant la base de dades web predeterminada per App 
Inventor, perquè les teues dades (la llista de preguntes i respostes) poden ser 
sobrescrits per altres, incloent a altres persones seguint aquest tutorial. 
Tingueu en compte que el servei web per defecte és compartit entre els 
programadors i aplicacions, de manera que és només per a proves. Quan estiguis 
llest per implementar l'aplicació amb usuaris reals, hauràs de configurar el teu propi 
servei de base de dades privada. Afortunadament, fer-ho és senzill i no requereix de 
programació. 
Figura 10-8. Emmagatzematge de les preguntes i respostes a la base de dades
TEMA 10 14/21 
Posa a prova la teva app. Introduïu una pregunta i resposta i feu clic 
a Envia. Per comprovar si les dades s'emmagatzemen a la base de 
dades com es vulgui, obriu un navegador i escriviu la 
http://appinvtinywebdb.appspot.com URL a la barra d'adreces. La 
pàgina que apareix és la interfície administrativa per a la base de dades i inclou una 
taula de parells de valors d'etiqueta. Si busques l'etiqueta que va utilitzar en els 
blocs StoreValue (per exemple, "preguntes"), es pot comprovar el valor 
emmagatzemat amb ell. També pot fer clic a l'opció-enllaç "/getvalue" i introduïu 
l'etiqueta per trobar el seu valor. ¿Les seves dades apareixen? 
Per carregar dades de la base de dades 
Una de les raons que tenim per emmagatzemar les preguntes i respostes en una 
base de dades és per que la persona al crear el qüestionari pot tancar l'aplicació i 
obrir-lo en un moment posterior, sense perdre les preguntes i respostes prèviament 
introduïdes. (Nosaltres també ho fem perquè el ContestarQuestionari pot tenir accés 
a les preguntes, però ens ocuparem d'això més endavant.) Anem al programa per 
carregar els blocs de les llistes de nou en l'aplicació de la base de dades web cada 
vegada que es reinicia l'aplicació. 
Com ja hem cobert en els temes anteriors, per especificar què ha de passar quan 
una aplicació s'inicia, es programa el controlador d'esdeveniments Screen.Initialize. 
En aquest cas, l'aplicació ha de sol·licitar dues llistes de la base de dades web 
TinyWebDB (les preguntes i les respostes), de manera que el Screen1.Initialize farà 
dues cridades a TinyWebDB.GetValue. 
Necessitaràs els elements llistats a la Taula 10-7. 
Taula 10-7. Blocs de Screen.Initialize per recuperar dades de bases de dades 
Tipus de Bloc Calaix Objectiu 
Screen1.Initialize Screen1 S'activa quan l'aplicació s'inicia. 
TinyWebDB.Get Value (2) TinyWebDB Sol·licitar les llistes emmagatzemades LlistaPreguntes i LlistaRespostes. 
text ("Preguntes") Text En lloc de "Preguntes", utilitzeu l'etiqueta que s'utilitza per emmagatzemar 
les preguntes. 
text ("Respostes") Text En lloc de "Respostes", utilitzeu l'etiqueta que s'utilitza per emmagatzemar 
les preguntes.
TEMA 10 15/21 
Com funcionen els blocs 
Els blocs TinyWebDB.GetValue, que es mostra a la Figura 10-9, funcionen de manera 
diferent que TinyDB.GetValue, que retorna un valor immediatament. 
TinyWebDB.GetValue només demana les dades de la base de dades web, però no 
rep immediatament un valor. En canvi, quan arribin les dades de la base de dades 
web, un esdeveniment TinyWebDB.GotValue es dispara. També ha de programar un 
controlador d'esdeveniments per processar les dades que es retornen. 
Figura 10-9. Sol·licitud de les llistes de la base de dades quan l'aplicació s'obre 
Quan l'esdeveniment TinyWebDB.GotValue ocorre, les dades sol·licitades estan 
contingudes en un argument amb nom valueFromWebDB. La marca sol·licitada es 
troba al argument tagFromWebDB. 
En aquesta aplicació, ja que es fan dos sol·licituds diferents per les preguntes i 
respostes, GotValue es dispararà dues vegades. Per evitar posar preguntes si 
LlistaRespostes o viceversa, la teua aplicació ha de comprovar l'etiqueta per veure 
quina sol·licitud ha arribat, i després posar el valor rebut de la base de dades a la 
llista corresponent (LlistaPreguntes o LlistaRespostes). Ara t'estàs donant compte de 
l'útil que realment són aquestes etiquetes! 
Necessitaràs els elements llistats a la Taula 10-8 per al controlador d'esdeveniments 
GotValue. 
Taula 10-8. Blocs per TinyWebDB.GotValue 
Tipus de Bloc Calaix Propòssit 
TinyWebDB.GotValue TinyWebDB S'activa quan les dades arriben. 
if Control Comprovar si la base de dades té dades. 
is a list? List Si les dades és una llista, és que no està buida. 
value valueFrom WebDB My Definitions L'argument que sosté les dades retornats per la base de dades. 
ifelse Control Pregunti quines sol·licitud GetValue han arribat. 
= Math Comparar tagFromWebDB a "preguntes". 
text ("Preguntes") Text Aquesta és l'etiqueta que s'utilitza per emmagatzemar 
LlistaPreguntes. 
value tagFromWebDB My Definitions Un argument de GotValue, especifica que sol·liciti. 
set global LlistaPreguntes to My Definitions Si tagFromWebDB és "Preguntes", aquesta llista s'ha d'establir. 
set global LlistaRespostes to My Definitions Si tagFromWebDB no és "Preguntes", aquesta llista s'ha d'establir. 
value valueFromWebDB (2) My Definitions Mantingui el valor rebut de la base de dades. 
if Control Comproveu que les dues llistes es carreguen abans de mostrar. 
= Math Comparar les longituds de les llistes. 
length of list (2) Lists Comprovar si les longituds de les llistes són les mateixes. 
global LlistaPreguntes My Definitions Connectar-lo a una de la longitud de blocs de llista. 
global LlistaRespostes My Definitions Connecteu aquesta en l'altra longitud de bloc de llista. 
call MostraPRs My Definitions Mostrar les preguntes i respostes recentment carregades.
TEMA 10 16/21 
Com funcionen els blocs 
L'aplicació crida a TinyWebDB1.GetValue dues vegades: una vegada per sol·licitar la 
LlistaPreguntes emmagatzemada i una altra vegada per sol·licitar la LlistaRespostes 
emmagatzemada. Quan arriben les dades de la base de dades web de qualsevol 
sol·licitud, l'esdeveniment TinyWebDB1.GotValue s'activa, com es mostra en la 
figura 10-10. 
Figura 10-10. GotValue s'activa quan les dades arriben des de la web 
L'argument valueFromWebDB de GotValue conté les dades retornades per la 
sol·licitud de la base de dades. Necessitem l'exterior bloc "if" al controlador 
d'esdeveniments perquè la base de dades retorna un text buit ("") en 
valueFromWebDB si és el primer cop que s'utilitza l'aplicació i no hi ha encara 
preguntes i respostes. En preguntar si el valueFromWebDB is a list? Esteu 
assegurant que hi ha algunes dades realment retornades. Si no hi ha cap dada, pots 
passar per alt els blocs per al processament de la mateixa. 
Si es retornen dades (is a list? És cert), els blocs han d'anar a comprovar quina 
sol·licitud ha arribat. L'etiqueta d'identificació de les dades estan en tagFromWebDB: 
seran tant "Preguntes" o "Respostes". Si l'etiqueta és "Preguntes", el 
valueFromWebDB es posa a la variable "LlistaPreguntes". En cas contrari (else), es 
col·loca al LlistaRespostes. 
Només volem mostrar les llistes després que tots dos han arribat (GotValue s'ha 
disparat dues vegades). Pensa com podria saber que es cert que té carregades 
ambdues llistes de la base de dades. Aquests blocs d'utilitzar un if de prova per 
comprovar si la longitud de les llistes són les mateixes, ja que això només pot ser 
veritat si tots dos s'han tornat. En aquest cas, el procediment MostraPRs que vas 
escriure anteriorment és cridat per a mostrar les dades carregades. 
Posa a prova la teva app. Reinicieu l'aplicació fent clic a "Connect to 
Device ..." en l'Editor de blocs. Quan l'aplicació s'inicia, ha de mostrar 
les preguntes i respostes prèviament introduïdes. Si tanca l'aplicació i 
reinicia, la prova anterior encara ha d'aparèixer.
TEMA 10 17/21 
L'aplicació completa: CrearQuestionari 
La figura 10-11 il·lustra els blocs finals per a l'aplicació CrearQuestionari. 
Figura 10-11. Els blocs per CrearQuestionari
TEMA 10 18/21 
ContestarQuestionari: una aplicació per prendre 
l'examen de la Base de Dades 
Ara tens una aplicació CrearQuestionari que emmagatzemarà una prova en una 
base de dades web. Construir ContestarQuestionari, l'aplicació que carrega 
dinàmicament la prova, és més senzill. Pot ser construït amb unes poques 
modificacions del que has fet en el tema 8. 
Obriu el qüestionari de l'aplicació “El Gran Concurs del Presidents”, triant desa i, a 
nomenar el nou projecte "ContestarQuestionari". Això deixarà la seva aplicació “El 
Gran Concurs del Presidents” sense modificacions, però li permeten usar els seus 
blocs com a base per ContestarQuestionari. 
A continuació, realitzi els canvis següents en el Dissenyador: 
1. Aquesta versió de CrearQuestionari / ContestarQuestionari no mostra les 
imatges amb cada pregunta, així que primer eliminar les referències a les 
imatges des de l'aplicació ContestarQuestionari. En el Dissenyador de 
components, seleccioneu cada imatge des de la paleta de Media i elimineu-lo. 
A continuació, l'eliminació del component Image1, que eliminarà totes les 
referències a ell des del Editor de blocs. 
2. Des ContestarQuestionari treballarà amb dades de bases de dades, 
arrossegueu un component TinyWebDB en l'aplicació. 
3. Com que no vols que l'usuari respongui, feu clic al BSeguent fins que les 
preguntes estan carregats, desseleccioneu la propietat Enabled del BResposta 
i BSeguent.
TEMA 10 19/21 
ContestarQuestionari: La modificació dels blocs de 
carregar el qüestionari de la Base de Dades 
Ara modificar els blocs de manera que el qüestionari donat a l'usuari es carregue 
des de la base de dades. En primer lloc, ja que no hi ha preguntes i respostes fixes, 
treure tota la qüestió actual i respondre als blocs de text des del bloc make a list 
dins de la LlistaPreguntes i LlistaRespostes. Els blocs resultants han d'aparèixer tal 
com es mostra en la figura 10-12. 
Figura 10-12. Les llistes de preguntes i respostes comencen en buit 
També pot eliminar per complet la PictureList, aquesta aplicació no s'ocuparà de les 
imatges. Ara modifiqui la Screen1.Initialize perquè cridi TinyWebDB.GetValue dues 
vegades per carregar les llistes, tal com ho va fer en CrearQuestionari. Heu de mirar 
com ho fan els blocs a la figura 10-13. 
Figura 10-13. Sol·licitud de les preguntes i respostes de la base de dades web 
Finalment, arrossegueu un controlador d'esdeveniments TinyWebDB.GotValue. 
Aquest controlador d'esdeveniments ha de ser similar a la utilitzada en 
CrearQuestionari, però aquí volem mostrar només la primera pregunta i cap de les 
respostes. Intenta fer aquests canvis pel teu compte, i després fer una ullada als 
blocs de la figura 10-14 per veure si coincideixen amb la teva solució. 
Figura 10-14. GotValue maneja les dades que arriben des de la web
TEMA 10 20/21 
Com funcionen els blocs 
Quan l'aplicació s'inicia, Screen1.Initialize es dispara i l'aplicació sol·licita les 
preguntes i respostes de la base de dades web. Quan cada petició arriba, el 
controlador d'esdeveniments TinyWebDB.GotValue es dispara. L'aplicació comprova 
primer si hi ha de fet les dades de valueFromWebDB utilitzant is a list?. Si troba 
dades, l'aplicació vos demanarà quina sol·licitud ha entrat, utilitzant tagFromWebDB, 
i col·loca el valueFromWebDB a la llista corresponent. Si la LlistaPreguntes s'està 
carregant, la primera pregunta es selecciona de LlistaPreguntes i es mostra. Si la 
LlistaRespostes s'està carregant, el BResposta i BSeguent estan habilitades perquè 
l'usuari pot començar a fer la prova. 
Posa a prova la teva app. Reinicieu l'aplicació fent clic a "Connect to 
Device ..." en l'Editor de blocs. La primera pregunta del seu 
qüestionari CrearQuestionari apareix? Es pot fer un examen, tal 
com va fer amb el “El Gran Concurs de Presidents” (excepte les 
fotografies)? 
L'aplicació completa: ContestarQuestionari 
La Figura 10-15 il·lustra els blocs finals per ContestarQuestionari. 
Figura 10-15. Els blocs per ContestarQuestionari
TEMA 10 21/21 
Variacions 
Quan hageu acabat CrearQuestionari i ContestarQuestionari, és possible que 
vulgueu explorar algunes variacions. Per exemple: 
• Permeti que el CrearQuestionari especifique una imatge per a cada pregunta. 
Per descomptat, el desenvolupador de l'aplicació no es pot precarregar les 
imatges, i actualment no hi ha manera que l'usuari de l'aplicació puga fer-ho. 
Així que les imatges hauran de ser URL de la web, i el CrearQuestionari haurà 
d'introduir aquestes URL com un tercer element en el formulari 
CrearQuestionari. Recordeu que pot establir la propietat Picture d'un 
component d'imatge a una URL. 
• Permeti que el CrearQuestionari puga eliminar elements de les preguntes i 
respostes. Pots deixar que l'usuari triï una pregunta utilitzant el component 
ListPicker, i es pot treure un element de la llista d'elements del bloc remove 
(recordeu de treure de les dues llistes i actualitzar la base de dades). 
• Deixeu que el nom del CrearQuestionari puga ser canviat. Haurà de guardar el 
nom del qüestionari sota un codi diferent a la base de dades, i hauràs de 
carregar el nom juntament amb el qüestionari de ContestarQuestionari. Quan 
hagi carregat el nom, l'utilitzen per establir la propietat Screen.Title perquè 
aparegui quan l'usuari realitza una prova. 
• Permet crear múltiples qüestionaris. Necessitaràs una llista de qüestionaris, i 
es pot utilitzar el nom de cada qüestionari com (part de) l'etiqueta per 
emmagatzemar les seves preguntes i respostes. 
Resum 
Aquests són alguns dels conceptes que hem tractat en aquest tema: 
• Les dades dinàmiques és informació introduïda per part de l'usuari de 
l'aplicació, o carregades per les bases de dades. Un programa que treballa 
amb dades dinàmiques és més abstracte. 
• Pots emmagatzemar dades de forma persistent en una base de dades web 
amb el component TinyWebDB. 
• Pots recuperar dades d'una base de dades TinyWebDB sol·licitant-la amb 
TinyWebDB.GetValue. Quan la base de dades web retorna les dades, 
l'esdeveniment TinyWebDB.GotValue es dispara. Al controlador 
d'esdeveniments TinyWebDB.GotValue, pots posar les dades en una llista o 
processar-les d'alguna manera. 
• Les dades TinyWebDB es poden compartir entre diversos telèfons i 
aplicacions.

More Related Content

T10 questionari

  • 1. TEMA 10 1/21 CrearQuestionari i ContestarQuestionari L'aplicació “El Gran Concurs del Presidents” en el tema 8 es pot personalitzar per construir qualsevol prova, però la personalització es limita als programadors de App Inventor. Només tu, com a programador, pot modificar les preguntes i respostes, i no hi ha manera que els pares, mestres, o altres usuaris d'aplicacions per crear els seus propis qüestionaris o canviar les preguntes de l'examen (a menys que ells també vulguen aprendre a utilitzar App Inventor! ). En aquest tema, construiràs una aplicació que permet a un “mestre” crear qüestionaris utilitzant un formulari d'entrada. Les preguntes de l'examen i respostes s'emmagatzemen en una base de dades de manera que "els estudiants" poden accedir a una aplicació separada per a fer l'examen. En la construcció d'aquestes dues aplicacions, podràs fer un altre salt conceptual significatiu i aprendre a crear aplicacions amb les dades generades per l'usuari que es comparteix entre les aplicacions i els usuaris. CrearQuestionari i ContestarQuestionari són dues aplicacions que funcionen en tàndem i permet que un "mestre" cree qüestionaris per a un "estudiant." Els pares poden crear aplicacions divertides i curioses per als seus fills durant un llarg viatge per carretera,els professors de primària poden construir proves de matemàtiques, i en la universitat els estudiants poden construir proves per ajudar els seus grups d'estudi per preparar un examen final. Aquest tema es basa en “El Gran Concurs del Presidents” del tema 8, de manera que si no ha completat aquesta aplicació, has de fer-ho abans de seguir aquí. Vas a dissenyar dues aplicacions, CrearQuestionari per al "mestre" (veure Figura 10-1) i ContestarQuestionari per al estudiant. Amb CrearQuestionari: Figura 10-1. L'aplicació CrearQuestionari • L'usuari introdueix preguntes i respostes en un formulari d'entrada. • Les parelles entrades pregunta-resposta es mostren. • Les preguntes i respostes de l'examen s'emmagatzemen en una base de dades. ContestarQuestionari funcionarà de manera similar a l'aplicació “El Gran Concurs del Presidents” que ja has construït. De fet, crearàs aquesta aplicació utilitzant “El Gran Concurs del Presidents” com a punt de partida. ContestarQuestionari es diferència en que les preguntes seran les que es van introduir a la base de dades utilitzant CrearQuestionari.
  • 2. TEMA 10 2/21 El que aprendràs El Gran Concurs de Presidents va ser un exemple d'una aplicació amb dades estàtiques: no importa quantes vegades fas la prova, les preguntes són sempre les mateixes, ja que s'escriuen com a part de l'aplicació. Aplicacions de notícies, blocs, i aplicacions de xarxes socials com Facebook i Twitter treballen amb dades dinàmiques, el que significa que poden canviar amb el temps. Sovint, aquesta informació és genera dinàmicament pels usuaris, l'aplicació permet als usuaris introduir, modificar i compartir informació. Amb CrearQuestionari i ContestarQuestionari, aprendràs com construir una aplicació que s'encarrega de les dades generades per l'usuari. Si has completat l'aplicació del xilòfon (tema 9), ja has estat introduït en les llistes dinàmiques; en aquesta aplicació, les notes musicals que l'usuari toca es registren en les llistes. Aplicacions amb les dades generades per l'usuari són més complexes, i els blocs són més abstractes, ja que no es basen en les dades predefinides i estàtiques. Es defineix la variable llista, però sense definir elements específics. En programar la seva aplicació, cal preveure les llistes que s'omplen amb les dades introduïdes per l'usuari final. Aquest tutorial cobreix els conceptes d'App Inventor següents: • Els formularis d'entrada per permetre que l'usuari introdueixi informació. • Mostrar elements de diverses llistes. • Dades persistents: CrearQuestionari salvarà les preguntes i respostes de l'examen en una base de dades web, i ContestarQuestionari les carregarà des de la mateixa base de dades. • Intercanvi de dades: podràs emmagatzemar les dades en una base de dades web utilitzant el component TinyWebDB (en lloc del component TinyDB utilitzat en temes anteriors). Introducció Connectar-se a la pàgina web d'App Inventor i començar un nou projecte. El nom de "CrearQuestionari" i establir el títol de la pantalla de "CrearQuestionari". Obri l'Editor de blocs i connectat al teu telèfon.
  • 3. TEMA 10 3/21 Disseny dels components Utilitzeu el Dissenyador de components per crear la interfície de CrearQuestionari. En acabar, s'hauria d'assemblar a la Figura 10-2 (també hi ha instruccions més detallades després de la instantània). Pots construir la interfície d'usuari que es mostra a la Figura 10-2 arrossegant els components indicats a la Taula 10-1. Arrossega cada component a la paleta en el visor i el nom com s'especifica a la taula. Tingueu en compte que pots deixar els noms de les etiquetes de capçalera (Label1 - Label4) com els seus valors per defecte (no els utilitzaràs en l'Editor de blocs de tota manera). Figura 10-2. CrearQuestionari al Dissenyador de components Taula 10-1. Tots els components de l'aplicació CrearQuestionari Component Paleta Nom assignat Objectiu TableArrangement Screen Arrangement TableArrangement1 Donar format a la pregunta i la resposta. Label Basic Label1 La "Pregunta:". TextBox Basic TBPregunta L'usuari introdueix preguntes aquí. Label Basic Label2 La "Resposta:". TextBox Basic TBResposta L'usuari introdueix respostes aquí. Button Basic BEnviar L'usuari fa clic en aquest per presentar un parell de Preguntes i Respostes. Label Basic Label3 Mostra prova "Preguntes i Respostes". Label Basic EtPreguntesRespostes Mostra els parells Preguntes-Respostes introduïts anteriorment. TinyWebDB No està preparat per a la primera vegada. TinyWebDB1 Emmagatzemar dades, per a recuperar-les més tard.
  • 4. TEMA 10 4/21 Establir les propietats dels components de la següent manera: 1. Establir el text de Label1 a "Pregunta", el text de Label2 a "Resposta", i el text de Label3 per "Preguntes i Respostes". 2. Estableixi la Grandària de Lletra de Label3 a 18 i marqui la casella FontBold. 3. Ajusteu el TBPregunta a "Introdueix una pregunta" i el de TBResposta a "Introdueix una resposta". 4. Establir el text de BEnviar a "Enviar". 5. Establir el text de EtPreguntesRespostes a "Preguntes i Respostes". 6. Moveu el TBPregunta, TBResposta, i les seves etiquetes associades a TableArrangement1. Afegir comportaments als Components Igual que amb l'aplicació “El Gran Concurs del Presidents”, primer definir algunes variables globals per a la LlistaPreguntes i LlistaRespostes, però aquest cop no ens proporcionarà preguntes i respostes fixes. La Taula 10-2 enumera els elements que necessitarà per definir les llistes. Taula 10-2. Blocs per a la definició de la pregunta i la resposta llistes Tipus de Bloc calaix Propòssit def variable ("LlistaPreguntes") Definitions Definiu la variable LlistaPreguntes. def variable ("LlistaRespostes") Definitions Definiu la variable LlistaRespostes. make a list Lists Configureu la LlistaPreguntes de nous temes. make a list Lists Configureu la LlistaRespostes de nous temes. Els blocs han de ser com es mostra a la Figura 10-3. Figura 10-3. Les llistes per CrearQuestionari Tingueu en compte que, a diferència de l'aplicació “El Gran Concurs del Presidents”, les llistes es defineixen sense elements en les ranures. Això és perquè amb CrearQuestionari i ContestarQuestionari, totes les dades seran creats per l'usuari de l'aplicació (és dinàmica, les dades generades per l'usuari).
  • 5. TEMA 10 5/21 Enregistrament de les entrades de l'usuari El primer comportament que construïm és per controlar l'entrada de l'usuari. En concret, quan l'usuari introdueix una pregunta i resposta i fa clic en enviar, fareu servir afegir l'element a la llista de blocs per actualitzar el LlistaPreguntes i LlistaRespostes. La Taula 10-3 enumera els elements que necessitarà. Taula 10-3. Blocs per registrar les entrades de l'usuari Tipus de Bloc Calaix Objectiu BEnviar.Click BEnviar S'activa quan l'usuari fa clic en aquest botó. add items to list (2) Lists Afegiu les dades que l'usuari introdueix per les llistes. global LlistaPreguntes My Definitions Connecteu està en la ranura de "llista" del primer bloc add items to list. TBPregunta.Text TBPregunta Entrada d'usuari, enganxa està en la ranura "element" dels primer bloc add items to list. global LlistaRespostes My Definitions Connecteu està en la ranura “llista” del segon bloc add items to list. TBResposta.Text TBResposta Entrada d'usuari, enganxa està en la ranura "element" dels segon bloc add items to list. set EtPreguntesRespostes.Text to EtPreguntesRespostes Mostra les llistes actualitzades. make text Text Construeix un objecte de text amb dues llistes. global LlistaPreguntes My Definitions Les preguntes. text (:) Text Col·loqueu dos punts entre les llistes. global LlistaRespostes My Definitions Les respostes.
  • 6. TEMA 10 6/21 Com funcionen els blocs El bloc add items to list annexa, o afegeix, cada element al final d'una llista. Com es mostra a la Figura 10-4, l'aplicació pren el text que l'usuari ha introduït en les caixes de text TBPregunta i TBResposta i annexa a cada una la llista corresponent. Els blocs add items to list actualitza les variables LlistaPreguntes i LlistaRespostes, però aquests canvis encara no es mostra a l'usuari. La tercera fila de blocs mostra aquestes llistes mitjançant la concatenació d'elles (fer el text) amb dos punts al mig. Per defecte, App Inventor mostra llistes amb parèntesis que envolten i els espais entre els elements d'aquesta manera: (item1 item2 elemento3). Per descomptat, aquesta no és la forma ideal per mostrar les llistes, sinó que li permetrà posar a prova el comportament de l'aplicació per ara. Més tard, crearem un mètode més sofisticat de mostrar les llistes que apareixen cada parell de preguntes i respostes en una línia separada. Figura 10-4. Afegint les noves entrades a la llista Posa a prova la teva app. Al telèfon, escriviu una pregunta i la resposta i feu clic al BEnviar. L'aplicació ha de mostrar la sola entrada a la LlistaPreguntes, dos punts, i després l'única entrada de la LlistaRespostes. Afegir una segona pregunta i la resposta a assegurar-se que les llistes es creen correctament.
  • 7. TEMA 10 7/21 Netejant les preguntes i respostes Com es recordarà des de l'aplicació “El Gran Concurs del Presidents”, quan va passar a la següent pregunta a la llista, és necessari per ocultar els resultats de les respostes de la pregunta anterior. En aquesta aplicació, quan un usuari envia un parell de preguntes i respostes, voldràs esborrar les caixes de text TBPregunta i TBResposta perquè estiguin llestos per a una nova entrada en lloc de mostrar l'anterior. Per això, afegiu els blocs que figuren en la taula 10-4 a la part inferior del controlador d'esdeveniments BEnviar.Click. Taula 10-4. Blocs per quedar-se en blanc la pregunta i caselles de resposta de text Tipus de Bloc Calaix Objectiu set TBPregunta.Text to TBPregunta En blanc la pregunta. set TBResposta.Text to TBResposta En blanc la resposta. text (two blank ones) Text Reemplaci TBPregunta i TBResposta. Com funcionen els blocs Quan l'usuari envia una nova pregunta i resposta, que s'afegeixen a les seves respectives llistes i es mostra. En aquest punt, el text al TBPregunta i TBResposta es queda en blanc amb blocs de text buits, com es mostra a la Figura 10-5. Tingueu en compte que pot crear un bloc de text buit fent clic al text dins del bloc i prémer Elimina. Figura 10-5. Netejant les caixes de text de pregunta i resposta després de la presentació
  • 8. TEMA 10 8/21 Posa a prova la teva app. Afegiu algunes preguntes i respostes. Cada vegada que envieu un parell, el TBPregunta i TBResposta ha de ser netejat; només la pista apareix (per exemple, "Introdueix una pregunta "). Veient parells pregunta-resposta en diverses línies En l'aplicació que s'ha construït fins ara, les llistes de preguntes i respostes es mostren per separat i amb el format predeterminat de visualització de la llista de App Inventor. Així que, si estàs fent un examen sobre capitals dels estats i havia dos parells de preguntes i respostes, podria semblar així: (Quina és la capital de Califòrnia? Quina és la capital de Nova York? Sacramento Albany) Com es pot imaginar, si algú crea una prova bastant llarg, pot ser bastant complicat. Una millor visualització es mostrar cada pregunta amb la seva resposta corresponent, amb un parell de preguntes i respostes per línia com aquesta: Quina és la capital de Califòrnia: Sacramento Quina és la capital de Nova York: Albany La tasca aquí és una mica més complicada, ja que està tractant amb dues llistes. La causa de la seva complexitat, posaràs els blocs en un procediment anomenat MostraPRs, i cridaràs a aquest procediment des del controlador d'esdeveniments BEnviar.Click. Per mostrar els parells pregunta-resposta en línies separades, hauràs de fer el següent: • Utilitzeu un bloc foreach per iterar a través de cada pregunta a LlistaPreguntes. • Utilitzeu una variable RespostaIndex de manera que pots prendre cada resposta a mesura que itera a través de les preguntes. • Utilitzeu make text per a construir un objecte de text amb cada parella pregunta i resposta, i un caràcter de nova línia (n) que separa cada parella. Necessitaràs els elements llistats a la Taula 10-5.
  • 9. TEMA 10 9/21 Taula 10-5. Blocs per mostrar les parelles pregunta-resposta en línies separades Tipus de Bloc Calaix Propòssit to procedure ("MostraPRs") Definition Aquest procediment és un bloc que tanca tots els altres blocs. def var ("Resposta") Definition Emmagatzemar temporalment cada resposta. def var ("RespostaIndex") Definition Mantingui un registre de la resposta (i la pregunta) que l'usuari està connectat. text ("text") Text Inicialitzeu la variable Resposta a text. number (1) Math Inicialitzeu la variable RespostaIndex to 1. set EtPreguntesRespostes.Text to My Definitions Inicialitzar l'etiqueta a buid. text ("") Text Connectar-ho a set EtPreguntesRespostes.Text to. set global RespostaIndex to My Definitions Restableix RespostaIndex cada vegada que MostraPRs es cridada. number (1) Math Restableix RespostaIndex a 1. foreach Control Recorrer la LlistaPreguntes. name question (Apareix com un argument de foreach, el nom per defecte és var.) Canvieu el nom de la variable foreach de marcador de posició a question. global LlistaPreguntes My Definitions Connecteu esta en la ranura “llist” de foreach. set answer to My Definitions Establiu aquesta variable cada vegada al foreach. select list item Lists Seleccioneu a la llista LlistaRespostes. global LlistaRespostes My Definitions Connecteu està en la "llista" de la ranura select list item. global RespostaIndex My Definitions Connecteu aquesta al "índex" de la ranura select list item. set global RespostaIndex to My Definitions Incrementar l'índex en cada iteració del bucle. + Math Incrementar RespostaIndex. global RespostaIndex My Definitions Connecteu aquesta en +. number (1) Math Connecteu aquesta en +. set EtPreguntesRespostes.Text to EtPreguntesRespostes Mostrar les QA. make text Text Construir cada parell QA. EtPreguntesRespostes.Text EtPreguntesRespostes En iterar, afegiu cada nou parell dels anteriors. text ("n") Text Col·loqueu una nova línia entre parells. value question My Definitions Aquest és el marcador de posició del foreach, és la pregunta actual que estem processant. text (":") Text Col·loqueu dos punts entre la pregunta i la resposta. global answer My Definitions La resposta actual.
  • 10. TEMA 10 10/21 Com funcionen els blocs El bloc MostraPRs encapsula tots els blocs per mostrar les dades, com es mostra a la Figura 10-6. Mitjançant l'ús d'un procediment, no tindrem els blocs de la pantalla més d'una vegada en l'aplicació, i només podem cridar MostraPRs quan hem de mostrar les llistes. Figura 10-6. El procediment MostraPRs El foreach només li permet recórrer una llista. En aquest cas, hi ha dues llistes, i cal seleccionar cada resposta a mesura que avança a través de les preguntes. Per aconseguir això, utilitzarem una variable d'índex, com ho vam fer amb l'Índex de PreguntaActual en el tema 8. En aquest cas, la variable d'índex, RespostaIndex, s'utilitza per rastrejar la posició en la LlistaRespostes com el foreach passa a través de la LlistaPreguntes. RespostaIndex es posa a 1 abans que el foreach comence. Dins el foreach, RespostaIndex selecciona la resposta actual de la LlistaRespostes, i després s'incrementa. A cada iteració del foreach, la pregunta actual i resposta es concatena amb el final de la propietat EtPreguntesRespostes.Text, amb dos punts entre ells.
  • 11. TEMA 10 11/21 En trucar al nou procediment Ara disposa d'un procediment per a la visualització de les parelles pregunta-resposta, però no ajudarà a menys que ho digui quan ho necessiti. Modifiqueu el controlador d'esdeveniments BEnviar.Click cridant MostraPRs en lloc de mostrar les llistes amb el senzill EtPreguntesRespostes.Text bloc set EtPreguntesRespostes.Text to. Els blocs d'actualització haurian d'aparèixer com es mostra a la Figura 10-7. Figura 10-7. En cridar al procediment MostraPRs de BEnviar.Click Posa a prova la teva app. Al telèfon, afegir unes quantes més parelles de pregunta-resposta. La pantalla ha de mostrar cada pregunta amb la seua resposta corresponent, amb cada parella de preguntes i respostes en una línia separada.
  • 12. TEMA 10 12/21 Emmagatzematge de les preguntes i respostes en una base de dades Fins ara, has creat una aplicació que posa les preguntes i respostes en una llista. Però, què passa si l'aplicació CrearQuestionari es tanca? Si has completat el tema 4 o el tema 7, saps que si no emmagatzema les dades en una base de dades, no seran allà quan l'usuari tanca i torna a obrir l'aplicació. L'emmagatzematge de les dades de manera constant permetrà que l'aplicació CrearQuestionari puga veure o editar la darrera actualització de la prova cada vegada que s'obre. L'emmagatzematge persistent també és necessària perquè l'aplicació ContestarQuestionari necessita tenir accés a les dades. Ja estàs familiaritzat amb l'ús del component TinyDB per emmagatzemar i recuperar dades d'una base de dades. Però en aquest cas, utilitzarem el component TinyWebDB. Mentre que TinyDB emmagatzema la informació directament en un telèfon, TinyWebDB emmagatzema dades en bases de dades que resideixen a la web. La seua aplicació necessita utilitzar una base de dades en línia en lloc d'una emmagatzemada al telèfon d'una persona. La qüestió clau aquí és que estàs construint dues aplicacions que necessiten tenir accés a les mateixes dades, si el CrearQuestionari emmagatzema les preguntes i respostes en el seu telèfon, els ContestarQuestionari no tindrà manera d'arribar a les dades. Com que el TinyWebDB emmagatzema dades a la Web, el ContestarQuestionari pot accedir a les preguntes i respostes de l'examen en un dispositiu diferent a la de l'examen del CrearQuestionari. Aquest és l'esquema general per a fer la llista de dades com les preguntes i respostes persistents: • Guardi una llista a la base de dades cada vegada que un nou element s'afegeix a la mateixa. • Quan l'aplicació s'inicia, carrega la llista de la base de dades en una variable. Iniciar mitjançant l'emmagatzematge de la LlistaPreguntes i LlistaRespostes a la base de dades cada vegada que l'usuari entra en una nova parella. Anem a afegir els elements que es mostren a la Taula 10-6 per al controlador d'esdeveniments BEnviar.Click. Taula 10-6. Els blocs per a l'emmagatzematge de les dades a la base de dades Tipus de Bloc Calaix Objectiu TinyWebDB1.StoreValue TinyWebDB1 Deseu les preguntes de la base de dades. text ("Preguntes") Text Connecteu "qüestions" com l'etiqueta de StoreValue. global Question List My Definitions Connecteu està en el "valor" de la ranura StoreValue. TinyWebDB1.StoreValue TinyWebDB1 Deseu les respostes a la base de dades. text ("Respostes") Text Connecteu "respostes" com l'etiqueta de StoreValue. global LlistaRespostes My Definitions Connecteu està en el "valor" de la ranura StoreValue.
  • 13. TEMA 10 13/21 Com funcionen els blocs Els blocs TinyWebDB1.StoreValue emmagatzemen les dades en una base de dades web. StoreValue té dos arguments: l'etiqueta que identifica les dades i el valor que són les dades reals que vol emmagatzemar. Com es mostra a la Figura 10-8, la LlistaPreguntes s'emmagatzema amb una etiqueta de "Preguntes", mentre que el LlistaRespostes s'emmagatzema amb una etiqueta de "Respostes". No obstant això, per a la teua aplicació, has d'utilitzar etiquetes distintes de "Preguntes" i "Respostes" (per exemple, "JosepPreguntes " i "JosepRespostes"). Això és important perquè estàs utilitzant la base de dades web predeterminada per App Inventor, perquè les teues dades (la llista de preguntes i respostes) poden ser sobrescrits per altres, incloent a altres persones seguint aquest tutorial. Tingueu en compte que el servei web per defecte és compartit entre els programadors i aplicacions, de manera que és només per a proves. Quan estiguis llest per implementar l'aplicació amb usuaris reals, hauràs de configurar el teu propi servei de base de dades privada. Afortunadament, fer-ho és senzill i no requereix de programació. Figura 10-8. Emmagatzematge de les preguntes i respostes a la base de dades
  • 14. TEMA 10 14/21 Posa a prova la teva app. Introduïu una pregunta i resposta i feu clic a Envia. Per comprovar si les dades s'emmagatzemen a la base de dades com es vulgui, obriu un navegador i escriviu la http://appinvtinywebdb.appspot.com URL a la barra d'adreces. La pàgina que apareix és la interfície administrativa per a la base de dades i inclou una taula de parells de valors d'etiqueta. Si busques l'etiqueta que va utilitzar en els blocs StoreValue (per exemple, "preguntes"), es pot comprovar el valor emmagatzemat amb ell. També pot fer clic a l'opció-enllaç "/getvalue" i introduïu l'etiqueta per trobar el seu valor. ¿Les seves dades apareixen? Per carregar dades de la base de dades Una de les raons que tenim per emmagatzemar les preguntes i respostes en una base de dades és per que la persona al crear el qüestionari pot tancar l'aplicació i obrir-lo en un moment posterior, sense perdre les preguntes i respostes prèviament introduïdes. (Nosaltres també ho fem perquè el ContestarQuestionari pot tenir accés a les preguntes, però ens ocuparem d'això més endavant.) Anem al programa per carregar els blocs de les llistes de nou en l'aplicació de la base de dades web cada vegada que es reinicia l'aplicació. Com ja hem cobert en els temes anteriors, per especificar què ha de passar quan una aplicació s'inicia, es programa el controlador d'esdeveniments Screen.Initialize. En aquest cas, l'aplicació ha de sol·licitar dues llistes de la base de dades web TinyWebDB (les preguntes i les respostes), de manera que el Screen1.Initialize farà dues cridades a TinyWebDB.GetValue. Necessitaràs els elements llistats a la Taula 10-7. Taula 10-7. Blocs de Screen.Initialize per recuperar dades de bases de dades Tipus de Bloc Calaix Objectiu Screen1.Initialize Screen1 S'activa quan l'aplicació s'inicia. TinyWebDB.Get Value (2) TinyWebDB Sol·licitar les llistes emmagatzemades LlistaPreguntes i LlistaRespostes. text ("Preguntes") Text En lloc de "Preguntes", utilitzeu l'etiqueta que s'utilitza per emmagatzemar les preguntes. text ("Respostes") Text En lloc de "Respostes", utilitzeu l'etiqueta que s'utilitza per emmagatzemar les preguntes.
  • 15. TEMA 10 15/21 Com funcionen els blocs Els blocs TinyWebDB.GetValue, que es mostra a la Figura 10-9, funcionen de manera diferent que TinyDB.GetValue, que retorna un valor immediatament. TinyWebDB.GetValue només demana les dades de la base de dades web, però no rep immediatament un valor. En canvi, quan arribin les dades de la base de dades web, un esdeveniment TinyWebDB.GotValue es dispara. També ha de programar un controlador d'esdeveniments per processar les dades que es retornen. Figura 10-9. Sol·licitud de les llistes de la base de dades quan l'aplicació s'obre Quan l'esdeveniment TinyWebDB.GotValue ocorre, les dades sol·licitades estan contingudes en un argument amb nom valueFromWebDB. La marca sol·licitada es troba al argument tagFromWebDB. En aquesta aplicació, ja que es fan dos sol·licituds diferents per les preguntes i respostes, GotValue es dispararà dues vegades. Per evitar posar preguntes si LlistaRespostes o viceversa, la teua aplicació ha de comprovar l'etiqueta per veure quina sol·licitud ha arribat, i després posar el valor rebut de la base de dades a la llista corresponent (LlistaPreguntes o LlistaRespostes). Ara t'estàs donant compte de l'útil que realment són aquestes etiquetes! Necessitaràs els elements llistats a la Taula 10-8 per al controlador d'esdeveniments GotValue. Taula 10-8. Blocs per TinyWebDB.GotValue Tipus de Bloc Calaix Propòssit TinyWebDB.GotValue TinyWebDB S'activa quan les dades arriben. if Control Comprovar si la base de dades té dades. is a list? List Si les dades és una llista, és que no està buida. value valueFrom WebDB My Definitions L'argument que sosté les dades retornats per la base de dades. ifelse Control Pregunti quines sol·licitud GetValue han arribat. = Math Comparar tagFromWebDB a "preguntes". text ("Preguntes") Text Aquesta és l'etiqueta que s'utilitza per emmagatzemar LlistaPreguntes. value tagFromWebDB My Definitions Un argument de GotValue, especifica que sol·liciti. set global LlistaPreguntes to My Definitions Si tagFromWebDB és "Preguntes", aquesta llista s'ha d'establir. set global LlistaRespostes to My Definitions Si tagFromWebDB no és "Preguntes", aquesta llista s'ha d'establir. value valueFromWebDB (2) My Definitions Mantingui el valor rebut de la base de dades. if Control Comproveu que les dues llistes es carreguen abans de mostrar. = Math Comparar les longituds de les llistes. length of list (2) Lists Comprovar si les longituds de les llistes són les mateixes. global LlistaPreguntes My Definitions Connectar-lo a una de la longitud de blocs de llista. global LlistaRespostes My Definitions Connecteu aquesta en l'altra longitud de bloc de llista. call MostraPRs My Definitions Mostrar les preguntes i respostes recentment carregades.
  • 16. TEMA 10 16/21 Com funcionen els blocs L'aplicació crida a TinyWebDB1.GetValue dues vegades: una vegada per sol·licitar la LlistaPreguntes emmagatzemada i una altra vegada per sol·licitar la LlistaRespostes emmagatzemada. Quan arriben les dades de la base de dades web de qualsevol sol·licitud, l'esdeveniment TinyWebDB1.GotValue s'activa, com es mostra en la figura 10-10. Figura 10-10. GotValue s'activa quan les dades arriben des de la web L'argument valueFromWebDB de GotValue conté les dades retornades per la sol·licitud de la base de dades. Necessitem l'exterior bloc "if" al controlador d'esdeveniments perquè la base de dades retorna un text buit ("") en valueFromWebDB si és el primer cop que s'utilitza l'aplicació i no hi ha encara preguntes i respostes. En preguntar si el valueFromWebDB is a list? Esteu assegurant que hi ha algunes dades realment retornades. Si no hi ha cap dada, pots passar per alt els blocs per al processament de la mateixa. Si es retornen dades (is a list? És cert), els blocs han d'anar a comprovar quina sol·licitud ha arribat. L'etiqueta d'identificació de les dades estan en tagFromWebDB: seran tant "Preguntes" o "Respostes". Si l'etiqueta és "Preguntes", el valueFromWebDB es posa a la variable "LlistaPreguntes". En cas contrari (else), es col·loca al LlistaRespostes. Només volem mostrar les llistes després que tots dos han arribat (GotValue s'ha disparat dues vegades). Pensa com podria saber que es cert que té carregades ambdues llistes de la base de dades. Aquests blocs d'utilitzar un if de prova per comprovar si la longitud de les llistes són les mateixes, ja que això només pot ser veritat si tots dos s'han tornat. En aquest cas, el procediment MostraPRs que vas escriure anteriorment és cridat per a mostrar les dades carregades. Posa a prova la teva app. Reinicieu l'aplicació fent clic a "Connect to Device ..." en l'Editor de blocs. Quan l'aplicació s'inicia, ha de mostrar les preguntes i respostes prèviament introduïdes. Si tanca l'aplicació i reinicia, la prova anterior encara ha d'aparèixer.
  • 17. TEMA 10 17/21 L'aplicació completa: CrearQuestionari La figura 10-11 il·lustra els blocs finals per a l'aplicació CrearQuestionari. Figura 10-11. Els blocs per CrearQuestionari
  • 18. TEMA 10 18/21 ContestarQuestionari: una aplicació per prendre l'examen de la Base de Dades Ara tens una aplicació CrearQuestionari que emmagatzemarà una prova en una base de dades web. Construir ContestarQuestionari, l'aplicació que carrega dinàmicament la prova, és més senzill. Pot ser construït amb unes poques modificacions del que has fet en el tema 8. Obriu el qüestionari de l'aplicació “El Gran Concurs del Presidents”, triant desa i, a nomenar el nou projecte "ContestarQuestionari". Això deixarà la seva aplicació “El Gran Concurs del Presidents” sense modificacions, però li permeten usar els seus blocs com a base per ContestarQuestionari. A continuació, realitzi els canvis següents en el Dissenyador: 1. Aquesta versió de CrearQuestionari / ContestarQuestionari no mostra les imatges amb cada pregunta, així que primer eliminar les referències a les imatges des de l'aplicació ContestarQuestionari. En el Dissenyador de components, seleccioneu cada imatge des de la paleta de Media i elimineu-lo. A continuació, l'eliminació del component Image1, que eliminarà totes les referències a ell des del Editor de blocs. 2. Des ContestarQuestionari treballarà amb dades de bases de dades, arrossegueu un component TinyWebDB en l'aplicació. 3. Com que no vols que l'usuari respongui, feu clic al BSeguent fins que les preguntes estan carregats, desseleccioneu la propietat Enabled del BResposta i BSeguent.
  • 19. TEMA 10 19/21 ContestarQuestionari: La modificació dels blocs de carregar el qüestionari de la Base de Dades Ara modificar els blocs de manera que el qüestionari donat a l'usuari es carregue des de la base de dades. En primer lloc, ja que no hi ha preguntes i respostes fixes, treure tota la qüestió actual i respondre als blocs de text des del bloc make a list dins de la LlistaPreguntes i LlistaRespostes. Els blocs resultants han d'aparèixer tal com es mostra en la figura 10-12. Figura 10-12. Les llistes de preguntes i respostes comencen en buit També pot eliminar per complet la PictureList, aquesta aplicació no s'ocuparà de les imatges. Ara modifiqui la Screen1.Initialize perquè cridi TinyWebDB.GetValue dues vegades per carregar les llistes, tal com ho va fer en CrearQuestionari. Heu de mirar com ho fan els blocs a la figura 10-13. Figura 10-13. Sol·licitud de les preguntes i respostes de la base de dades web Finalment, arrossegueu un controlador d'esdeveniments TinyWebDB.GotValue. Aquest controlador d'esdeveniments ha de ser similar a la utilitzada en CrearQuestionari, però aquí volem mostrar només la primera pregunta i cap de les respostes. Intenta fer aquests canvis pel teu compte, i després fer una ullada als blocs de la figura 10-14 per veure si coincideixen amb la teva solució. Figura 10-14. GotValue maneja les dades que arriben des de la web
  • 20. TEMA 10 20/21 Com funcionen els blocs Quan l'aplicació s'inicia, Screen1.Initialize es dispara i l'aplicació sol·licita les preguntes i respostes de la base de dades web. Quan cada petició arriba, el controlador d'esdeveniments TinyWebDB.GotValue es dispara. L'aplicació comprova primer si hi ha de fet les dades de valueFromWebDB utilitzant is a list?. Si troba dades, l'aplicació vos demanarà quina sol·licitud ha entrat, utilitzant tagFromWebDB, i col·loca el valueFromWebDB a la llista corresponent. Si la LlistaPreguntes s'està carregant, la primera pregunta es selecciona de LlistaPreguntes i es mostra. Si la LlistaRespostes s'està carregant, el BResposta i BSeguent estan habilitades perquè l'usuari pot començar a fer la prova. Posa a prova la teva app. Reinicieu l'aplicació fent clic a "Connect to Device ..." en l'Editor de blocs. La primera pregunta del seu qüestionari CrearQuestionari apareix? Es pot fer un examen, tal com va fer amb el “El Gran Concurs de Presidents” (excepte les fotografies)? L'aplicació completa: ContestarQuestionari La Figura 10-15 il·lustra els blocs finals per ContestarQuestionari. Figura 10-15. Els blocs per ContestarQuestionari
  • 21. TEMA 10 21/21 Variacions Quan hageu acabat CrearQuestionari i ContestarQuestionari, és possible que vulgueu explorar algunes variacions. Per exemple: • Permeti que el CrearQuestionari especifique una imatge per a cada pregunta. Per descomptat, el desenvolupador de l'aplicació no es pot precarregar les imatges, i actualment no hi ha manera que l'usuari de l'aplicació puga fer-ho. Així que les imatges hauran de ser URL de la web, i el CrearQuestionari haurà d'introduir aquestes URL com un tercer element en el formulari CrearQuestionari. Recordeu que pot establir la propietat Picture d'un component d'imatge a una URL. • Permeti que el CrearQuestionari puga eliminar elements de les preguntes i respostes. Pots deixar que l'usuari triï una pregunta utilitzant el component ListPicker, i es pot treure un element de la llista d'elements del bloc remove (recordeu de treure de les dues llistes i actualitzar la base de dades). • Deixeu que el nom del CrearQuestionari puga ser canviat. Haurà de guardar el nom del qüestionari sota un codi diferent a la base de dades, i hauràs de carregar el nom juntament amb el qüestionari de ContestarQuestionari. Quan hagi carregat el nom, l'utilitzen per establir la propietat Screen.Title perquè aparegui quan l'usuari realitza una prova. • Permet crear múltiples qüestionaris. Necessitaràs una llista de qüestionaris, i es pot utilitzar el nom de cada qüestionari com (part de) l'etiqueta per emmagatzemar les seves preguntes i respostes. Resum Aquests són alguns dels conceptes que hem tractat en aquest tema: • Les dades dinàmiques és informació introduïda per part de l'usuari de l'aplicació, o carregades per les bases de dades. Un programa que treballa amb dades dinàmiques és més abstracte. • Pots emmagatzemar dades de forma persistent en una base de dades web amb el component TinyWebDB. • Pots recuperar dades d'una base de dades TinyWebDB sol·licitant-la amb TinyWebDB.GetValue. Quan la base de dades web retorna les dades, l'esdeveniment TinyWebDB.GotValue es dispara. Al controlador d'esdeveniments TinyWebDB.GotValue, pots posar les dades en una llista o processar-les d'alguna manera. • Les dades TinyWebDB es poden compartir entre diversos telèfons i aplicacions.