Delphi Android acesso direto a banco de dados hospedado com UniDAC

Sempre me perguntei como minhas aplicações Android desenvolvidas com Delphi XE7 poderiam acessar diretamente um banco de dados hospedado.

Pois bem, esta semana recebi uma DM no Twitter da DevArt. Eles me convidavam para estudar e comentar a sua suite de componentes de acesso a dados, o UniDAC (Universal Data Access Components). Obviamente pelo que os componentes propõem,  aceitei de primeira, afinal pode ser a solução para a questão que citei acima.

O que é o UniDAC?

O UniDAC é uma solução multi-plataforma para o desenvolvimento de aplicações usando vários IDEs: do RAD Studio, Delphi, C ++ Builder, Lazarus (e FPC) no Windows, Mac OS X, iOS, Android além de Linux e FreeBSD.

IDEs e Plataformas suportadas pelo UniDAC

Trata-se de  uma suíte de componentes que prover banco de dados, suportando alguns dos principais SGBDs (Sistemas de Gerenciamento de Banco de Dados) conhecidos no mercado atual como: MySQL, MS SQL SERVER, Oracle, InterBase, Firebird, PostgreSQL, SQLite, DB2, Microsoft Access, além de outros banco que podem ser acessados através de ODBC.

Como o UniDAC lida com o acesso a dados?

Alguns banco de dados são acessados diretamente, sem a necessidade da biblioteca cliente. De maneira simplificada seria você não precisar distribuir a DLL do banco junto com sua aplicação para que a mesma consiga fazer acesso à base de dados.

Esquema de acesso a dados do UniDAC

Atualmente o UniDAC permite que sua aplicação Mobile ou Desktop possa trabalhar com Oracle, SQL Server, MySQL, PostgreSQL, SQLite, e NexusDB diretamente sem necessidade de biblioteca cliente do BD.

Um banco de dados MySQL  para teste

Para iniciarmos os testes, eu resolvi disponibilizar um banco de dados MySQL de exemplo hospedado em um provedor de internet e as credenciais de acesso serão passadas em nossa conexão mais adiante.

UniDac Acesso MySQL

Conhecendo a Suite UniDAC

Para conhecer um pouco mais sobre os componentes que compõem a suíte do UniDAC clique aqui.

Basicamente,  no nosso exemplo vamos fazer uma aplicação multi dispositivo que irá acessar nosso banco de dados MySQL hospedado num dado provedor de hospedagem. Por ser algo bem simples e apenas para fins de teste vamos abordar apenas 3 componentes:

Componente TUniConnection

TUniConnection  permite configurar e gerenciar a conexão com os diversos SGBDs suportados.

Componente TUniQueryTUniQuery permite a utilização de instruções SQL para recuperação, atualização e inserção dados nas tabelas.

Componente TUniProviderTUniProvider componente base para as ligações entre a aplicação e o SGBD. No nosso caso TMySQLUniProvider.

Hora de colocarmos a mão na massa

Bem vamos iniciar o Delphi XE7, e criar um nova aplicação Multi Device em branco. Nela vamos inserir os componentes da suíte UniDAC retratados acima,  e mais 1 Image, 1 ListView e 1Button, e configurá-los como segue:

  • Image1
    • Align -> Top
    • WrapMode -> Stretch
    • MultiResBitmap -> adicione um imagem a seu gosto.
  • Button1
    • Align -> Botton
    • Text -> ‘Conectar MySQL’
  • ListView1
    • Align -> Client

Ao final do deste processo sua tela terá uma aparência semelhante à imagem abaixo:

Design da Interface de Usuário -  Acesso direto a Banco de dados com UniDAC

E como configurar a suíte UniDAC

Até agora apenas colocamos na aplicação os componentes e como seria a configuração dos mesmos? Será complexo??? Bem já adianto que tudo é muito intuitivo, mas nada melhor do que conferir. Vamos lá!

No nosso componente UniConnection1 vamos alterar as propriedades como segue:

  • ProviderName -> MySQL
  • Porta -> 3306
  • LoginPrompt -> False
  • Server -> vivaitaocara.com.br
  • UserName -> vivai026_exemplo
  • Password -> exemplo

Com essas informações já estamos credenciados a acessar o servidor do MySQL hospedado no provedor, vamos então definir qual banco de dados acessar através da propriedade Database. Ao clicar no seletor a conexão será ativada e o banco de dados vivai026_bdexemplo estará disponível selecione-o.

Este processo também pode ser efetuado através do Connection Editor que pode ser acionado clicando com o botão direto no mouse sobre o componente UniConnection e selecionando esta opção. Veja  na imagem que um Wizard é aberto para alterações por telas mais amigáveis.

TUniConnection - ConnectionEditor

Nota: Desconecte a aplicação alterando a propriedade Connected do UniConnection1 para False. Pois ao selecionar o banco de dados a aplicação se conecta ao servidor e retorna as opções disponíveis, entretanto a conexão permanece ativa impossibilitando que o componente UniQuery1 possa ser testado.

Para nosso componente UniQuery1 vamos configurar as seguintes propriedades:

  • Connection -> UniConnection1
  • SQL –> ‘select * from medicamentos’

Porém ao clicar sobre o botão elipse (reticências) da propriedade SQL do UniQuery1, a janela abaixo será carregada.

UniQuery - SQL Editor

Não vamos entrar em todas as abas disponíveis na janela, vamos nos ater apenas ao comando SQL para efetuar a busca na base de dados para alimentar nossa aplicação. Finalize a janela clicando no botão OK.

Vamos agora configurar agora o clique do nosso Button1, que será responsável por conectar a aplicação e resgatar os dados do servidor preenchendo com eles o ListView1:

procedure TForm1.ConecClick(Sender: TObject);
var
  lvItem : TListViewItem;
  I: Integer;
begin
  UniConnection1.Close;
  UniQuery1.Open;
  ListView1.Items.Clear;
  ListView1.BeginUpdate;
  for I := 0 to UniQuery1.RecordCount -1 do
    begin
      lvItem := ListView1.Items.AddItem();
      lvItem.Text :=
          UniQuery1.Fields[1].AsString + ' ' +
          UniQuery1.Fields[2].AsString;
      UniQuery1.Next;
    end;
  ListView1.EndUpdate;
  UniConnection1.Close;
end;

Feito isso já podemos executar nossa aplicação. Veja que em Win32 a mesma já funciona perfeitamente:

Sem alterar nenhuma linha vamos alterá-la para distribuição na plataforma Android e confira o resultado no vídeo Abaixo:

Nota: Por ser uma versão Trial temos uma limitação de 6 campos por dataset (tabelas ou consultas)como exibido em mensagem no vídeo. Lembrando que a versão trial tem validade de 60 dias.
Mensagem de Limitação da versão Trial

TUniProvider sem configuração, mas não sem importância

Concluímos a codificação de nosso exemplo e com isso você pode ter percebido que embora tenhamos incluído em nossa aplicação o MySQLUniProvider1 (TMySQLUniProvider) ele não necessitou nenhuma configuração.

O componente cada provider usa a conectividade nativa específica do SGBD, sendo capazes de realizar as operações CRUD (Create, Read, Update, Delete) considerando automaticamente as particularidades do SGBD selecionado.

 Quer saber a importância do provider nesse caso??? Retire-o do projeto e execute-o novamente! Sem ele toda essa "mágica" não é possível, a menos que você tenha a biblioteca cliente instalada em sua máquina.

Conclusão

Com esse dia de testes cheguei a conclusão que vale muito a investir primeiro seu tempo em conhecer mais os componentes e em se adaptando perfeitamente no seu modelo de projeto por que não investir também financeiramente na aquisição da versão completa do UniDAC, afinal a mesma está sendo vendida no site da DevArt por aproximadamente US$ 200,00.

Fico por aqui, abaixo links e até a próxima!

UniDAC Versão Trial

UniDAC para compra

 

38 respostas para “Delphi Android acesso direto a banco de dados hospedado com UniDAC”

  1. Landerson, Parabéns pelo post!! To com trancando em um app com alguns problemas..
    – App que fica nos processos do celular/tablet? Existe alguma maneira de fechar ele totalmente?
    – Tratamento de exceções em campos Currency/Float linkados pelo live bindings? E colocar mascara nesses campos tbm..
    – Trabalho com o ListView MultiDetailItem e quando faço alterações, nao atualiza a lista.. Nao queria recarregar as informações do servidor, pois o app funciona com 3g tbm..
    – E ainda estou com dificuldades no envio e recebimento de imagens (Já havia te questionado sobre isso);

    Se souber de alguma solução.. Agradeço pela atenção de sempre!!

    Valeuuu!!

    1. Grande Yago! E aí meu nobre?! Bom ter sua participação novamente…e mais uma vez com grandes questões e grandes desafios!
      Amigão embora eu tenha sempre apresentado aqui um grau de complexidade um pouco abaixo do enfrentado por você vou tentar ajudá-lo, espero que consiga!
      Bom, vamos por partes:

      – App que fica nos processos do celular/tablet? Existe alguma maneira de fechar ele totalmente?

      O recomendado é SharedActivity.Finish;

      – Tratamento de exceções em campos Currency/Float linkados pelo live bindings? E colocar mascara nesses campos tbm..

      Meu trabalho com Visual LiveBind até o momento é quase nulo, mas acredito que boas práticas possam ser utilizadas em todas as plataformas, então vejo como uma boa solução você não tratar como currency, já que os aparelhos podem pegar configurações internacionais e na sua tela você formatar com máscara da unidade monetária, a não ser que realmente seu caso seja de aplicação internacional. Aqui tem que atentar também para utilização sempre de Format Settings, afinal separadores decimais fazem verdadeiros estragos no nosso tempo até notarmos que estão errados.

      – Trabalho com o ListView MultiDetailItem e quando faço alterações, nao atualiza a lista.. Nao queria recarregar as informações do servidor, pois o app funciona com 3g tbm..

      Bem acredito que a combinação da propriedade PullToRefresh com o evento OnPullToRefresh vai atendê-lo. Acredito que após a sua alteração você deve fazer uma nova consulta, aqui fique atento pois você precisa fazer de forma que limpe cache, acredito que com esses pontos você terá uma luz nessa questão.

      – E ainda estou com dificuldades no envio e recebimento de imagens (Já havia te questionado sobre isso);

      Amigo realmente ainda não fiz nada nesse sentido, embora seus questionamentos tenham despertado uma enorme curiosidade.
      A propósito, ontem na CodeRage Brasil 3 o Mário Guedes fez algo assim no exemplo dele… sugiro que assim que sair o fonte do exemplo você estude, com toda certeza vai solucionar, ou vá direto na fonte… Grita o Mário lá no http://eugostododelphi.blogspot.com.br/.

      Obrigado mais uma vez com sua participação… acabo aprendendo muito com ela sempre.
      Forte abraço e até a próxima!

  2. Muito bom este artigo…
    Fiz exatamente como descrito no exemplo…
    Roda normalmente no desktop, mas no
    celular dá a seguinte mensagem:
    Unknow host ‘vivaitaocara.com.br’. Socket error Code: 0($0)
    O que pode ser?
    Obrigado, Lúcio Coelho.

    1. Olá Lúcio… seja bem vindo!
      Certifique-se de ter conexão com a internet (wi-fi, ou pacote de dados da sua operadora).
      O host que é reportado é exatamente este mesmo host que você está acessando o blog, no caso do MySQL que disponibilizei para possibilitar os testes é exatamente esse em que sua mensagem no blog é registrada.
      Enfim, aparentemente é apenas isso… você no momento da consulta pode ter perdido a conexão.

      Obrigado por sua participação e por favor poste um feedback se funcionou!
      Cordialmente.

      1. Obrigado por responder tão rápido;
        Mas o Celular está conectado na mesma rede do PC.
        Fiz um teste, com alguns sites, facebook, etc.. está normal,
        Mas não conecta ao bd. Inclusive troquei o Host, por um que eu tenho um banco de dados, e deu a mesma mensagem.

  3. Só passei pra agradecer, mais uma vez, e deixar registrado o grande profissional e parceiro que você é. Fiz um questionamento e fui respondido com muita atenção e paciência, sem contar a rapidez como foi condizido o assunto. Deveriam existir mais pessoas como você. Muito obrigado. Deus te abençoe.
    Lúcio Coelho – Angra System.

    1. Assim você me deixa sem graça Lúcio!!! Mas falando sério que bom que tenha dado tudo certo aí!
      Bom trabalho, bons negócios para você e sua empresa aí!
      Se precisar de algo a meu alcance passa aqui no blog e dá um grito!

      Mais uma vez obrigado por sua participação!

  4. Bom dia meu amigo Landerson. Só pra acrescentar, a versão Standard ($199,00) não dá suporte para Android, mas somente a Professional ($299,00). Comprei a versão Standard e me dei mal. Estou tentando a troca e pagar a diferença de $100,00 e eles não aceitam. Querem que tu faça o upgrade e pague mais $139,00 e com direito a validade de 1 ano. Grande abraços.

  5. Bom dia!
    Muito bom o artigo, parabéns!
    Já estou usando o Unidac para acesso ao MSSQL (Android) e funciona perfeitamente, porém não roda com Firebird (realmente no site diz que não tem suporte a ele, com mobile) e Oracle (da erro de uma dll client ao rodar no android).
    Já fez alguma aplicação usando o Oracle?
    Abraço!

    1. Olá Anderson! Seja bem vindo!!! Quando a Devart entrou em contato comigo trocamos ideias sobre algumas coisas e sugeri esse funcionalidade. Apresente-lhes um breve estudo embasando a sugestão e provavelmente teremos novidades em breve. Outros contatos da Devart me disseram que a empresa gostou da sugestão e estaria produzindo, como não pediram segredo… pronto falei! rsrs

      Quanto ao Oracle não fiz ainda não. Já tentou acionar o suporte deles?!

      Grande abraço!

    1. Olá Ramon… primeiramente seja bem vindo!
      Obrigado pelas palavras, e que legal que está sendo útil afinal esse sempre foi o propósito: ajudar compartilhando algumas experiências minhas ao longo de alguns projetos que eu for fazendo por aqui.

      Sempre que posso estou por aqui.

      Mais uma vez obrigado, principalmente por sua participação!

      Grande abraço e até uma próxima.

  6. Boa tarde, Landerson, seus posts tem me ajudado muito excelentes e claros. Agradeço por sua generosidade em compartilhar seus conhecimentos.
    Peço desculpas por tomar seu precioso tempo, mas gostraria de sua ajuda,
    é o seguinte:
    Estou tendo problemas no deployment de um app que estou desenvolvendo usando Delphi XE8 e sqlite para iPhone, optei por não usar “binding” e percebi que sempre que faço
    o deployment sem usa-lo, o banco de dados não vai para o dispositivo junto com o app,
    quando eu uso “binding” o banco vai, mas vai sem as tabelas.
    Gostaria de receber algum esclarecimento sobre isto, ou se existe a possibilidade de você divulgar um vídeo com um exemplo asim, posso te enviar todo o código fonte da app se você se dispuser e conseguir um tempinho para tal, pois sei de sua falta de tempo, deixo claro que no windows a app roda lindamente.
    Certo de sua atençao
    um forte abraço e muita saúde e muito sucesso

    1. Domiciano… bem vindo!
      Eu também não uso “binding”… infelizmente não consegui entrar no universo da “maçã”, com isso minha experiência acaba sendo zero.
      Com relação a esse delpoy, tente http://docwiki.embarcadero.com/RADStudio/XE8/en/Deploying_Multi-Device_Applications#Deploying_an_Application_for_the_iOS_Platform.

      Enfim, no Android funcionou mesmo nos casos com banco de dados então é recorrer à DOCWIKI mesmo!

      Espero que consiga aí, obrigado por sua participação e até a próxima.

  7. Quando rodo o app no celular ele dá a mensagem “Application does not support this device”. Até pensei que fosse por meu celular ser antigo, mas usando um emulador com vários aparelhos aparece a mesma coisa, independente da versão do Android.

    No desktop funciona normal.

    OBS: usei um banco meu, que está aceitando conexão de fora da hospedagem normalmente e escrevi um código até mais simples que esse no delphi.

    Em tempo, parabéns pelos artigos!

    1. Olá Daniel… primeiramente seja bem vindo e obrigado por sua participação!

      Consegue informar a versão do Delphi, aparelho e Android instalado no mesmo… se quiser copiar parte do seu código de acesso também eu tentarei reproduzir aqui.

      Aguardo seu feedback e mais uma vez obrigado!

    1. Olá Geraldo, seja bem vindo!
      Que bom que as publicações têm sido úteis, esse é o propósito!
      Quanto a RCA, tive uma breve passagem lá, conheço a empresa desde a criação e grandes amigos lá! Mas, “sou da mamãe” rsrs. Enfim, não trabalho na RCA não.

      Grande abraço, obrigado por sua participação e até uma próxima!

  8. Estou pensando em comprar os componentes, mas, me ocorre uma dúvida aqui. Neste caso, os dados de meu banco de dados ficarão disponíveis dentro do APP Android, existe algum risco de alguém “descompilar” – digamos assim – o App e pegar essa informações? Existe algum tipo de recomendação ou segurança adicionais a fazer ou não, depois de compilado não tem como pegar essas infos do app?

  9. Olá, Muito bom o post, estou com um problema e gostaria de saber se pode me ajudar, quando compilo em Win32 roda normal tudo certo, mas no android inicia ja em tela preta e não sai, tem alguma dica ou sugestão que possa me ajudar?

    1. Olá James, peço desculpas pela demora!
      Muito provavelmente há algum erro de configuração no projeto, verifique se está com a conexão devidamente fechada em estado inicial… costuma ser esse o problema, mero caso de desatenção.

      Caso o problema ainda persista faça novo contato.

      Desde já agradeço por sua participação.

    1. Olá Carlos, bem vindo!
      Perdoe a demora na resposta… a base de dados em questão está hospedada em meu domínio, mas hoje praticamente todas as hospedagens brasileiras liberam bancos de dados mySql, consulte seu provedor sobre o assunto.

      Obrigado por sua participação!

    1. Olá Ignacio, bem vindo!
      Peço desculpas pela demora na resposta… vamos lá, o UniDAC propõe exatamente isso, sugiro que você entre em contato com o suporte da Devart para saber como é o comportamento no Delphi 7.

      Eu acredito que atenda sua necessidade, mas realmente não posso garantir… por isso faça contato direto com a Devart, baixe o trial e teste antes da compra e fique atento à versão correta para atender sua necessidade.

      Boa sorte e obrigado por sua participação!

  10. Prezado Landerson , parabéns pelos tutoriais, todos tem sido úteis para mim e tenho aprendido muito com eles.
    Embora este post não esteja relacionado com o que vou relatar, venho pedir sua atenção.
    Gostaria de sua ajuda, se possível, estou tendo dificuldade no desenvolvimento de um app para rodar no iOS que vai controlar o acesso de usuarios às aplicações desenvolvidas por mim, estou usando o Delphi Seattle e Sqlite. Vou descrever abaixo:
    1 – Quando faço a compilação ou a linkedição demora pelo menos tempo de 3 a 4 minutos para terminar a operação;
    2 – Todas as funcionalidades no windows funcionam perfeitamente, já no iPhone isso não acontece, você já passou por isso? estou apanhando muito com isso e não consigo entender porque isso acontece, uma vez que é dito que podemos desenvolver o sistema todo no windows que tudo vai funcionar em outra plataforma, certo?
    isso acontece na rotina que criptografa senhas, ou seja, no windows a rotina me dá um resiultado no iPhone outro.
    3 – Tenho uns check boxes que indicam o que o usuário pode fazer em uma certa rotina (perfil de acesso) que no iPhone não conseguem ter a propriedade checked alterada para true de forma nenhuma, no windows funciona perfeitamente.
    Bom fico por aqui, se você quiser posso passar o codigo para você.
    Certo de sua atenção
    Um forte abraço.

    1. Olá Domiciano, bem vindo de volta! Desculpe-me pela demora!
      Não consigo acrescentar muita coisa uma vez que não utilizei nada ainda dos recursos do Delphi para a Maçã.

      Acredito que Adriano Santos, Victory Fernandes sejam boas referências para você no assunto. Não deixe de acompanhá-los também nos respectivos canais do Youtbe.

      Mais uma vez obrigado por sua participação!

  11. Parabéns Pelo Site. Aprendi muito com os exemplos postados. Mas segue uma pergunta, como faz para gerar mensagens amigáveis sobre exceções; por ex: Se não conseguir conectar ao banco ou tiver uma violação de chave.. como gero uma msg amigável para o user ?

    Obrogado.

    1. Olá Danilo… consulte sobre tratamento de Exceções com Delphi, os comandos try except te acompnharão na jornada!
      Obrigado por sua participação e até a próxima!

      Não deixe de dar um feed back de seu progresso.

      Até a próxima!

  12. Obrigado Landerson.

    Eu estava pensando em algo mais ou menos assim:

    try

    Except

    on E: [“aqui um componente do da paleta, assim como o EFDDBEngineException do FireDAC”] do
    begin
    case E.Kind of
    ekUserPwdInvalid : [mensagem amigavel]
    end;
    end;
    end;

    Mas optei pelo uso do DataSnap + FireDAC mesmo. De qualquer forma, vlw pelo retorno.

  13. Bom dia, amigo Landerson!
    Você tem algum material explicando como faço para embutir um banco de dados dentro do android com a aplicação, ou seja, seria só para gravar os dados dentro do smartphone mesmo?
    Obrigado pela atenção!

  14. Olá, Landerson, tudo bem ? Obrigado por ter compartilhado teus conhecimentos. Achei ótimo o artigo. Porém, estou com um problema, se puder auxiliar-me, fico grato. No site que você disponibilizou, conecto sem problemas, a consulta está legal. Porém se eu mudo o server para “localhost” ou qualquer outro IP (tenho um servidor na web (gratuito) — porém recebo a mensagem de que a conexão está sendo recusada. Não consigo acessar nem localhost. Não sei mudar os privilégios de meu servidor Xampp (sei que pode ser esse tipo de problemas). Alguma sugestão ?? obrigado pela atenção.

    1. Olá Moisés, vc precisa verificar o seu IP de onde está o banco, feito isso garantir que a porta do banco esteja liberada no firewall e o banco esteja em funcionamento, sua conexão deve apontar para esse IP:porta, simples questão de rede… Daí tudo tem que funcionar.
      Obrigado por sua participação!

      1. Boa tarde, Landerson. Obrigado pela resposta.
        O problema acima eu resolvi assinando um provedor pago. Então eu pude enviar meu bd para lá e acessar sem empecilhos.
        Desculpe eu incomodar outra vez, porém eu fiz um servidor DataSnapa (com Delphi Berlin ) e um cliente (desktop). Ele funciona normalmente quando acesso localhost (ou 127.0.0.1) . Porém quando tento acessar via ip real (ou via redirecionamento pela DuckDns ) — sempre recebo erro de ” conexão recusada “. Já abri a porta do modem (211) — já deixei meu computador como ” DMZ “, desabilitei a firewall, o windows defender e sempre dá o erro. Alguma sugestão ?? Obrigado.
        Resumindo , posso acessar o DataSnap via internet ou isso não é possível ?

Deixe uma resposta