quarta-feira, 20 de março de 2013

Usando Fusion Tables Parte 2

Curso UDEMY : Android App in 1 Hour


Olá,

vamosà 2a. parte de nossa conversa sobre Fusion Tables.
Bem, definida a tabela no Google Drive , iremos então fazer uma aplicação simples que irá
INSERIR dados e posteriormente buscar os dados inseridos .

OK.

Então, crie um projeto novo e dê um nome a ele, por exemplo, Contatos.
Crie na tela de DESIGN uma viewer semelhante a esta :
1 Label com a propriedade text setada para : INSERT Contatos
1 Screen Arrangement/TableArrangements com 3 Rows / 2 Columns
* coloque lá na coluna 1 ---> 1 Label com Text=Nome , 1 Label com Text=email, 1 Label com Text=Telefone
* depois na COluna 2 , 1 Textbox de NomeTBNome, 1 Textbox de Nome=TBemail, 1 Textbox com Nome= Telefone.
1 Buttons de Nome = BTCadastra e com Text=INSERE

A barrinha preta vc faz assim...1 Label com propriedade with=(FILL PARENT) setada e Height=3pixels , BACKGROUND COLOR = Black
Abaixo  da barrinha coloque :
1 Label com Text = SELECT Contatos
1 TextBox de nome= nomecli
1 Button com Text = Buscar
1 Label  de nome (arraste um Label) e depois rename para dadoscliente
2 FusionTables components * FusionTable está na Palette , em NOT READY FOR PRIME TIME.


OK, feito isto vamos para o BLOCKS EDITOR...

O código (a ser explicado abaixo) para quando clicar no BTCadastra é este :

 Então , quando clicar no Button BTCadastra ,
1) Primeira coisa é setar o valor de SUA ApiKey (veja POST anterior como gerar sua APIKEY);
2) Depois montar a SQL(no bloco Set FusionTablesControl1.Query) , e fazer o INSERT(no caso, enviar a QUERY) na tabela (com o bloco Call FusionTablesControl1.SendQUery; .
* Observe que após o INSERT INTO , os caracteres são o ID (*) de sua tabela . O INSERT não será feito com o NOME de sua tabela usando o FusionTables.
   *para ter o ID de sua tabela vá no Google Drive, clique na sua tabela,depois em File / ABOUT THIS TABLE e copie o Encrypted ID , veja abaixo um exemplo :





COm os blocos acima, vc faz a INSERÇÃO(*) dos dados Nome, email  na sua tabela.
* os nomes dos campos tem que ser exatamente iguais aos que vc definiu quando da criação da tabela, inclusive observando maiúsculas e minúsculas), inseridos entre ASPAS SIMPLES.

Teste executando no emulador ou no Smartphone via Wifi.
Depois, verifique no Google Drive(abrindo sua tabela) se o insert foi executado.

Um detalhe, durante a execução, vai solicitar um LOGIN no Google, se vc definiu sua tabela como PRIVATE.
Para que outros possam ter acesso, vc terá que cadastrar o email de quem poderá acessar . Isto é feito no Google Drive , nas propriedades de SUA tabela.

Tudo certinho, vai funcionar e voce poderá incrementar sua QUERY como necessário. Vc poderá verificar que atualizou sua tabela no Google Drive (mantenha aberta a tabela no navegador enquanto executa a query para acompanhar se atualizou).
Importante : Em fase de testes , crie um campo label e capture o retorno da QUERY . Veja/adicione  o bloco na imagem acima , WHEN FusiontablesCOntrol1.GotResult. 
O erro mais comum é 400 Bad Request , neste caso a query mal-formada...

A sintaxe para montar sua SQL pode ser consultada neste link(*) (será desativado em ago/2017, veja abaixo) :
https://developers.google.com/fusiontables/docs/v1/sql-reference

A Google mudou para versão2 em 2017 , veja as infos em :
https://developers.google.com/fusiontables/docs/v2/using


A seguir, mais detalhes sobre o processo.

Até lá,

Germinaro

60 comentários:

  1. Olá Germinaro, sou Evandro.

    Estou tentando a muito custo rodar esta função e ainda não obtive sucesso. tentei com o seu modelo acima e também não rodou. relaciona um erro "400 Invalid query; Parse error near &#39conection'(line1, position0)

    Está complicado..

    já tentei nos tutoriais http://appinventor.mit.edu/explore/content/pizzaparty.html

    e

    http://www.droidforums.net/forum/droid-development/151561-app-inventor-fusion-tables-persistent-data.html

    que é parecido com o seu e ainda nada.

    pode dar uma luz???

    abraço

    Evandro Ramos
    evandroenf@gmail.com

    ResponderExcluir
    Respostas
    1. Prezado Evandro:

      Acredito que seja um problema com sintaxe de sua Query.
      Estas querys tem diferença com o padrão SQL.
      Para executar a query com a correta sintaxe consulte o seguinte link:
      https://developers.google.com/fusiontables/docs/v1/sql-reference

      Caso não corrija o problema, por favor me envie a query que está dando problema para que eu possa testar por aqui...

      Lembre-se tb de fazer a chamada com a API KEY e tb informar o Code da TAbela (e não o nome dela)....ok?

      abraço,

      Excluir
    2. Evandro,

      Veja o POST recentemente publicado - Verificando Fusion Table Result... tinha um problema no INSERT ... para funcionar tem que inserir ASPAS SIMPLES no nome das variáveis que fazem parte do insert...

      abraço,

      Excluir
  2. Opa...
    quanto as chaves estavam inseridas conforme. o problema foi mesmo de sintaxe...

    agora rodou maravilha..

    sua ajuda valeu para uma revisão geral!

    forte abraço!

    ResponderExcluir
  3. Olá, Germinaro!

    Meu nome é Márcio. Cara... Eu estou na mesma situação do Evandro (já tentei o pizzaparty tb; sem sucesso). No meu caso, seguindo suas instruções, o APP aparentemente roda legal (pois não mostra mensagem de erro) mas não preenche a FUSION TABLE.

    Me ajuda aí, por favor...

    Abração!

    ResponderExcluir
  4. Opa, amigão... Desculpe aí: funfou legal!! Só rolou um mega delay pra upar os dados. ;) MANDOU BENZAÇO NO TUTO, IRMÃO!!! Parabéns.

    ResponderExcluir
    Respostas
    1. Marcio, tem como me ajudar, teria um exemplo, já fiz de tudo e não funciona. já fiz, refiz, mudei para o TinyDB e nada...

      Excluir
    2. M.Sc. Márcio Souza, Estou com o mesmo problema que vc, o app roda mas n inseri nada na fusion table. O que vc fez para resolver o problemas?

      Excluir
  5. Boa Noite, fiz de tudo e não funcionou, coloquei um TB igual a sua Label6.text para verificar a sql aparentemente esta correto, so que nao subiu para o Driver. notei que o insert estava sendo montado com "," a mais devido ao primeiro bloco com os Join, retirei os "," mais nada, pode me ajudar.
    Outra duvida, minha ideia e um banco relacional, mais que fica-se no celular, pois onde pretendo usar o sinal 3G e fraco e notei que este tipo de banco fica pesado, com o TinyBd eu consigo, tipo ter tabelas relacionadas ex.: Cliente e vendas relacionando um para varias.

    Se for possivel eu envio o meu aplicativo para vc dar uma ajuda.

    ResponderExcluir
  6. Prezados, ainda não ajustei, mais identifiquei o problema e mesmo a sql (Insert) pois eu criei uma tabela com x campos mais como inicialmente iria usas só 3 campo no insert eu não coloquei os outros, coisa de iniciante, vou ajustar e testar.

    ResponderExcluir
  7. Boa Tarde, Fiz os ajustes mais não funcionou, não consigo visualizar os dados pelo Google Driver, tem alguma forma especifica ou para eu verificar se foram salvo?

    ResponderExcluir
  8. Alexandre...acessa o seu google dics e verifica se a tabela atualizou...

    ResponderExcluir
  9. Então pessoal aparece o horário da ultima atualização mais não aparece os dados.

    ResponderExcluir
  10. alexandre...veja que tem q informar o id da tabela corretamente..e sua api key tambem...

    ResponderExcluir
  11. Bom dia, pessoal ja fiz de Tudo, deletei aapi Key e criei uma nova, delete a minha tabela e continua o mesmo, a mensagem que da é a seguinte: 400 Bad Request Invalid query: Bad Column reference Name.... ja fiz de tudo e nao identificou o erro, estou usando o Programa pizzaparty sem nenhum ajuste, pode ser problema na minha rede?

    ResponderExcluir
  12. Olá Germinaro,
    Segui todos os passos para implementar. Não há mensagem de erro, porém o insert não ocorre.
    Mudei as propriedades da tabela, inclusive recriei a table e copiei o novo ID.
    O que pode estar havendo?
    Nota: executo o app do emulador.

    ResponderExcluir
  13. Caro Roni,

    No EMULADOR o INSERT não funcionará, pois neste caso necessita que seja feita conexão com a tabela do Google Docs (que está na NUVEM)...
    Instale a aplicação no smartphone e veja se funciona.
    Como já comentado no post, sua API KEY e a KEY de sua tabela no Google Docs tem que estar exatamente como fornecido lá quando da criação ... Não foi muito fácil fazer funcionar , mas aos poucos chegamos lá... Por uma questão de segurança o Google criou estes requisitos...

    abraço,

    ResponderExcluir
  14. O meu tbm, ja fiz pelo celular e nada d salvar

    ResponderExcluir
  15. Requisitos para funcionar :

    Vá em https://code.google.com/apis/console

    Clique no MENU em API ACCESS confira qual sua Fusion Tables API KEY (associada a seu email Google).

    COPIE a API KEY e cole na aplicação em : SET FusionTables.Control.APIKEY to xxxxx


    A ID da tabela no Google DOCS vc pega clicando em sua tabela no Google Drive e depois clicando no MENU em ABOUT THIS TABLE...

    A principio deve funcionar...

    Germinaro

    ResponderExcluir
  16. complementando...eh necessário ATIVAR o Service FUsion Tables na Google API COnsole.
    Vá em : https://code.google.com/apis/console
    clique em SERVICES e ATIVE o FUsion Tables ...ok?

    ResponderExcluir
  17. Boa Tarde Germinaro,

    Você poderia mostrar como ficaria fazendo um SELECT?

    ResponderExcluir
  18. Boa noite!

    Estou sem entender como fazer o SELECT (consulta).
    Montei uma forma simples que aparentemente deu certo (Select * From Tabela Where Nome='Luiz'), mas não consegui visualizar o resultado.

    Se já tiver desenvolvido essa parte...

    Obrigado

    ResponderExcluir
    Respostas
    1. Caro Luiz,
      COmo publicado no post acima : *para ter o ID de sua tabela vá no Google Drive, clique na sua tabela,depois em File / ABOUT THIS TABLE e copie o Encrypted ID , veja o exemplo no post acima.

      abraço,

      Excluir
  19. Poderia postar um tutorial sobre select...no meu caso consigo inserir tranquilamente qualquer valor na tabela...isso já não é um problema, mas agora queria saber como consultar um valor. no meu fica dando erro "Request Quota Exceeded...ERROR 400" que é cota eu sei que não é...enfim, parabens pelo tutorial e pela iniciativa de ajudar a galera!
    Valeu!!

    ResponderExcluir
    Respostas
    1. Caro Pedro Candido,

      Parece que esta mensagem tem a ver com RENOVAR a APIKEY ... para atualizar veja como fazer no post anterior que publiquei com o título USANDO FUSIONTABLES COM APPINVENTOR... a quota é de 25000 requests / dia ...

      abraco,

      Excluir
  20. Amigo, boa noite. Estou na mesma situação de outros colegas. Segui todo o seu exemplo, porém, não consegui enviar os dados pro fusion table. O pior é que nenhuma mensagem de erro é apresentada.

    ResponderExcluir
    Respostas
    1. Caro Pedro,
      No INSERT , insira ASPAS SIMPLES antes e depois do nome das variáveis que irás passar ...
      Uma forma de ver o resultado da QUERY(se deu errado ) é usar o controle WHEN Fusion1.Control.result ... se deu BAD REQUEST 400 , a query está mal-formada... Veja exemplo no Post de título - Verificando Fusion Query Result ...OK? abraço

      Excluir
    2. Companheiro, obrigado pela ajuda. Realmente é esse o erro encontrado, porém, ainda não consegui encontrar uma solução. Simplifiquei tabela e query pra ver se encontrava uma saida, e até agora nada.
      Minha query está dessa forma:
      INSERT INTO xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (NOME) VALUES ('A')
      Abraço!!!

      Excluir
  21. Pedro,
    Testei o INSERT (como o seu) aqui funcionou.
    Possívelmente o problema está no nome da tabela (pegar em ABOUT THIS TABLE) ao visualizar a tabela no Google... Tambem VErificar sua API Key...
    Sugestão :monte um bloco para mostrar o RETURN (se já nao o fez) como postei na imagem acima e me informe a mensagem que aparece ...
    Outro item a verificar é o nome correto do campo, inclusive Maiusculas/Minusculas tem que bater... na minha tabela o campo chama-se - Nome ...alterei na query para NOME (maiúsculas) e retornou Bad Column reference NOME...
    Outro detalhe: a conta Google que está fazendo a query TEM que ser a conta que CRIOU a tabela(se esta não é pública). Vc pode autorizar contas a acessar sua tabela. Verifique em ABOUT THIS TABLE em Usability and Reuse se está como Private e se este email que estás usando foi o email Google que criou a tabela.

    Abraço

    ResponderExcluir
  22. Pedro,

    Se quiseres , faça o download source de seu app e me envie o .zip para que eu teste por aqui . Nao esqueca de me incluir como autorizado na sua tabela do Google Drive .Lá em Edit Table information autorize o email : germinaro@gmail.com ou torne a tabela pública até funcionar. ok?

    abraço

    ResponderExcluir
    Respostas
    1. Germinaro, obrigado pela força.
      Te enviei um email com o source, e já permiti seu acesso a tabela.
      Forte abraço.

      Pedro Alex

      Excluir
    2. Pedro,

      Fiz UPLOAD de seu aplicativo ...realmente como está não funcionou... A única coisa que desconfio estar com problema seria a API KEY... o resto está OK ! Podes conferir ?

      Abraco,,
      Germinaro

      Excluir
    3. Amigo Germinaro, boa noite.
      Muito grato pela ajuda. Consegui inserir dados... hehehehe
      Realmente o problema era a API KEY.
      Forte abraço!

      Excluir
    4. Amigo Germinaro, Boa noite.
      Aproveitando o gancho, gostaria de saber se você tem algum exemplo de app com uso de GPS?
      Preciso capturar latitude e longitude.
      Abraço
      Abraço.

      Excluir
    5. Pedro,
      Ainda não desenvolvi nada que necessitasse de GPS.Mas o AppInventor tem um componente que trata disso.Dá uma olhada em :
      http://beta.appinventor.mit.edu/learn/reference/components/sensors.html#LocationSensor
      Tem um exemplo básico no tutorial em :
      http://beta.appinventor.mit.edu/learn/tutorials/whereismycar/whereismycar.html

      abraço,
      Germinaro

      Excluir
  23. E somar valores de colunas diferentes é possível? tentei de N formas mas não rola...sempre retorna que a query está errada... era para ser simples assim..SELECT SUM (Valor1 + Valor2 FROM tabelakey WHERE condição='alguma coisa'
    mas não vai..se souber de algo ficarei muito grato.

    abraço!

    ResponderExcluir
    Respostas
    1. Caro Pedro,

      A SINTAXE para acesso a Fusion Tables obedece a estas regras disponíveis em :
      https://developers.google.com/fusiontables/docs/v1/sql-reference

      Confira lá...OK?

      Abraço

      germinaro

      Excluir
    2. Já havia visto isso...mas não encontrei nada que auxilia com as operações (+-*/) entre colunas..estou garimpando...quando encontrar posto aqui.

      Mesmo assim obrigado pela atenção.

      Abraço!

      Excluir
  24. ola tudo bem entao consegui inserir na tabela mas esta indo nome.Txt e email.Txt na minha tabela poderia me ajudar?
    Grato.

    ResponderExcluir
    Respostas
    1. Olá Josue ,

      nome e email sao os nomes que utilizei como exemplos...tens que informar o nome do campo que VOCE criou para receber nome e email...OK?

      Excluir
  25. Olá, boa noite, está funcionando perfeito, porém achei o insert muito lento, é isso mesmo?
    Estou fazendo via emulator, mas testei pelo celular e ficou lento da mesma forma, as Fusion Tables são assim lentas?

    ResponderExcluir
    Respostas
    1. Olá André,

      Beleza que atualizou ...vc diz , demorou para atualizar ? podem ser vários fatores...conexão...Um detalhe, o recurso é gratuito até um X de inserçoes nas tabelas...e talvez, por ser gratuito eles deem uma segurada ïntencional"...entende ? abraço...

      Excluir
  26. Olá Germinaro, não consegui encontrar a parte 1 poderia me mandar o link?

    ResponderExcluir
  27. Ola Germinaro, estou fazendo um app de consulta.. criei uma tabela no fusiontables, coloquei apikey tudo direitinho nos blocks, tudo certo... porém quando efetuou a consulta a query ao invés de retornar o valor que quero da tabela fusion criada, está retornando www.google.com.... o que seria isto? como corrigir? pode me ajudar? abcss

    ResponderExcluir
    Respostas
    1. Olá Walfrido,

      Colocaste ON no Fusion Tables na Google ? Veja meu post parte 1 sobre o assunto ... Pode ser isso... Caso OK, poderias me enviar a App para que eu possa analisar e testar ? Envie para : germinaro@gmail.com

      Abraço

      Excluir
  28. Obrigado pela explicação, foi de grande valia.
    Aguardo ansioso, se for possível, explicação de como "Buscar" as informações na tabela pelo app inventor.

    Alguém conhece um bom livro em português para aprimorar o estudo, pois só encontro livros de SDK.

    Agradeço a que puder ajudar.

    ResponderExcluir
  29. Germinaro boa tarde,

    Poderia, por favor, nos dar um exemplo de como apresentar de uma forma amigável o resultado do SELECT na tela?
    No meu caso, o SELECT trouxe o resultado corretamente, porém não faço ideia de como formatar esses dados, poderia nos dar um exemplo?

    Por exemplo, meu SELECT é o seguinte:
    SELECT Email FROM (id da tabela...) WHERE Nome = (valor do TextBox))

    Ele retorna na Label o valor na Label:
    ((Email) (xxx@yyy.com.br))

    Ele traz o valor correto, porém nesse formato não muito amigável...

    Ja tentei jogar esse valor em uma ListView e em uma ListPicker mas não da certo...

    Gostaria de exibir esses valores numa tabela, de uma forma mais organizada, poderia me explicar como fazer isso? Não consegui achar nenhum exemplo na internet.

    Desde já agradeço,

    Gabriel

    ResponderExcluir
    Respostas
    1. Caro Gabriel,

      Dá uma olhada na sintaxe da SQL…
      Neste framework , a sintaxe SQL é uma pouco diferente da normal…então pode ser que algum parametro tenha que ser informado…

      https://developers.google.com/fusiontables/docs/v1/sql-reference

      abraco

      Germinaro

      Excluir
    2. Oi Germinaro tudo bem?

      Obrigado pelo retorno!

      Analisei a sintaxe e está correto, tanto que o sistema está trazendo o resultado correto da query.
      A minha dúvida está em como exibir esses dados de uma forma amigável usando os componentes do App Inventor. Como posso tratar esses dados que a query me traz?

      Por exemplo, determinada consulta me traz a informação da população de determinadas cidades
      São Paulo - 19 milhões
      Rio - 10 milhões

      Quero saber como faço pra colocar essas informações oriundas do banco de dados nas estruturas do App Inventor, entendeu? Em alguma tabela, por exemplo... tentei jogar o resultado da consulta no ListView e o ListPicker e não funcionou

      Só seguindo meu exemplo, queria exibir uma tabelinha mais ou menos assim:

      CIDADE | POPULAÇÃO
      Sp | 19
      Rio | 10

      Desde já agradeço,

      Gabriel

      Excluir
    3. A formatação do exemplo não ficou boa no post rs mas seria uma tabela exibindo esses dados oriundos de um Select no banco, ok? Minha dúvida é em qual componente de tela do App Inventor (e como) posso exibir esses dados.

      Att.

      Gabriel

      Excluir
  30. Olá, Germinaro,

    Tudo bem?

    Primeiramente, gostaria de dizer que seus posts estão me ajudando bastante na criação dos meus aplicativos, porque não sou um profissional da área. Parabéns!

    Mas o motivo do meu contato é para pedir uma ajuda. Não estou encontrando uma maneira de permitir que os usuários do app que estou desenvolvendo consigam compartilhar a localização uns com os outros. Eu tenho que fazer isto através do LocationSensor combinado com uma Fusion Table?

    Se sim, caso eu quizesse permitir a visualização de cada localização em uma mapa, também precisaria utilizar uma API do Google Maps?

    Agradeço desde já pela atenção,

    Rafael C. Libardi

    ResponderExcluir
  31. Olá Germino, posso criar varias tabelas diferentes, uma para cada aplicação numa mesma conta do google drive?? consigo importar vários contatos do cell e enviar para o google drive em .txt? obrigado

    ResponderExcluir
  32. Desculpa!

    Descobri agora que era só clicar na imagem.


    Valeu.

    ResponderExcluir
  33. Olá Germinaro.
    Estou tendo um problema com uma aplicação que usa o fusiontables eu tenho que fazer o serviço off-line e ao final do dia transmitor os dados de uma pesquisa. O que acontece é que parte dos dados se perdem devido a erros do tipo 5XX você já viu isso acontecendo e sabe como resolver.
    Muito obrigado.

    ResponderExcluir
  34. Olá Luciana...Nao conheco esse erro 5XX ... como eh essa aplicacao que voce usa...roda no smartphone? no computador?
    Sao atualizacoes nas tables ou insercoes? ha limites de insercoes na definicao de sua table?
    Faca uma pesquisa na propria Google sobre o assunto FusionTables Erro 5XX . Li na internet que o erro 500 eh comum......talvez encontre uma solucao...bom trabalho !

    ResponderExcluir
  35. Bom Germinaro, voce pode passar esse código para o app inventor 2, ou me passar o arquivo .aia do projeto, algumas partes do código entendo, mas não consigo fazer a conexão com o fusion table

    ResponderExcluir
  36. Amigo, conseguir inserir as informações, e conseguir buscar informações, porem estou com uma dificuldade especifica, vamos simplificar um exemplo, eu tenho no meu banco de dados 3 Colunas, Sendo por Exemplo Login, Senha, EMail, ao fazer a busca no fusion table com query SELECT * FROM, ele busca as linhas toda, essa é a intenção, mais o meu Resultado vem tipo assim,
    Result =
    Login,Senha,EMail
    Yuri,123456,yuri_miyazaki26@hotmail.com

    criei 3 Variáveis, gostaria que a coluna 1 que seria o nome carregasse a primeira variável a segunda carregar a senha e por fim a terceira carregar o email,
    acho que tenho que trabalhar com lista mais não faço a menor idéia, se souber como faz isso ou saber algum post que já foi solucionado isso passa ai, pois já procurei tudo

    ResponderExcluir
    Respostas
    1. Olá Yuri,

      Dá uma lida neste link:
      https://developers.google.com/fusiontables/docs/v2/using

      Espero que ajude...tem dicas de como tratar com as tabelas de sua Fusion Table...

      Bom trabalho !

      Excluir
  37. Boa tarde.
    O meu problema é com a transmissão de dados do apk para o fusion tables.
    No teste do qrcode, funciona perfeitamente, envia os dados na planilha sem problemas.
    Quando copilo e gero o apk, para instalação do aplicativo desenvolvido no celular, não transmite dados para planilha.
    no inicio transmitia 1 a cada 10 inserções e de repente parou de transmitir.
    Não dá nenhum erro.

    ResponderExcluir