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.