SQlite ou MySql ?

668 views
Skip to first unread message

Joao Fidalgo

unread,
Feb 4, 2011, 5:22:33 AM2/4/11
to Android Brasil - Dev
Bom dia,
preciso de uma ajuda.
Tenho um servidor MySql. Preciso que o celular se conecte pela
internet e baixe algumas tabelas para armazenar num bd dentro dele.
O que vocês indicam? Converter as tabelas para SQlite direto no
servirdor ou tem alguma forma do android acessar diretamente as
tabelas MySql ?

Obrigado pela ajuda.

Neto Marin

unread,
Feb 4, 2011, 5:26:30 AM2/4/11
to androidb...@googlegroups.com
Porque vc não faz algo "genérico" ?
Do tipo, vc expõe seus dados através de um serviço, e ai vc obtém os dados na sua app Android e salva como achar melhor. Isso pode ser uma vantagem se vc precisar de portabilidade na app e algum dia precise fazer em outra plataforma.

E na app Android vc pode fazer os inserts da maneira que achar melhor ou até salvar em arquivo...

[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


2011/2/4 Joao Fidalgo <pinkfl...@gmail.com>

Luiz Menezes

unread,
Feb 4, 2011, 5:43:54 AM2/4/11
to androidb...@googlegroups.com
Faz um Webservice (em Php, java, Ruby, qq coisa) que conecta no banco de dados e responde um JSON (ou XML).

Você consome esses dados em tempo real, mas será necessário uma conexão de internet.

Se a intenção sua é fazer o App rodar off-line, então rode em SQL Lite.

[ ]'s
image001.gif

Diego Ampessan

unread,
Feb 4, 2011, 5:54:44 AM2/4/11
to androidb...@googlegroups.com
você precisa armazenar as tabelas ?? ou os dados dela ?

você pode fazer uma camada de Sync .... onde no seu android, vc tenha a estrutura semelhante ao MySQL , e quando tiver conexão com a internet é possivel enviar as opções para o servidor e vice-versa.

Estou estou montando uma arquitetura para eu estudar disp. móveis, onde tenho uma aplicação WEB, (ASP.NET e SQLServer) e irei disponibilizar WebServices para que eu possa fazer o Sync com o meu servidor pelo celular....

Mas ate hoje, nao imaginei outra forma de manter os dados tanto no servidor WEB e celulares do que fazer uma sincronização da estrutura semelhante.

Outra alternativa (ainda não pensei em usar) é usar o Db4o nas aplicações do Android ( http://www.db4o.com/android/ ) onde não preciso da estrutura de tabelas dai... e sim, iria persistir o objeto em questão, independente da minha estrutura do servidor poderia fazer a persistencia tranquilamento.




2011/2/4 Luiz Menezes <luiz.m...@gmail.com>



--
[]'s
Att.
Diego

Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seu poder ultrapassa os limites da imaginação  - "Albert Einstein "

image001.gif

João Fidalgo

unread,
Feb 4, 2011, 6:05:52 AM2/4/11
to androidb...@googlegroups.com
Eu preciso que o android faça um cache dos dados no servidor.
É uma sincronia com o servidor.
Mas não é só cópia.
Eu vou criar um app pra visualizar esses dados.



Diego Ampessan

unread,
Feb 4, 2011, 6:13:19 AM2/4/11
to androidb...@googlegroups.com
Cara, acho a melhor opção para vc é manter o MySQL em seu servidor normal, e utilizar o SQLite no android, ai sua aplicação web, tenha serviços (web service) para que vc consiga sincronizar a sua aplicação web com seu disp. móvel.

A vantagem de usar um serviço é o que o Neto comentou, portabilidade, caso vc venha a criar para um aplicativo iOS, Windows Phone.....



2011/2/4 João Fidalgo <pinkfl...@gmail.com>

Neto Marin

unread,
Feb 4, 2011, 6:21:42 AM2/4/11
to androidb...@googlegroups.com
Nesse caso, o "buraco é mais embaixo"...

Vc vai precisar criar um sync server, inclusive com alguns métodos que indicam q o cache server está "sujo", principalmente se o usuário poder usar a app em mais de um telefone, por exemplo...

Então, vc precisará de alguns métodos auxiliares para o gerenciamento do cache. Ai nesse caso, eu teria uma estrutura espelho da estrutura que você tem na sua app e mais a estrutura pra vc gerenciar esse sincronismo. E no caso de o cache do lado do servidor sujar, vc pode enviar a notificação para o telefone através de push notification que assim buscará as informações atualizadas.

Mas o caminho é esse ai... 

Abraços
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


2011/2/4 João Fidalgo <pinkfl...@gmail.com>

João Fidalgo

unread,
Feb 4, 2011, 6:22:34 AM2/4/11
to androidb...@googlegroups.com
Diego, onde posso conseguir alguns exemples desse caso?
Estou começando a programar no Android e esse projeto é um desafio para mim.

Obrigado

Diego Ampessan

unread,
Feb 4, 2011, 6:29:47 AM2/4/11
to androidb...@googlegroups.com
@Joao, cara, eu sou tão iniciante quanto você em android... Só fiz um Olá mundo ate hoje... ainda estou estruturando minha aplicação WEB para dai partir para o android e acessar as informações de lá....

Então, fico te devendo exemplos disso, ainda só tenho o esquema na minha cabeça, não sei se o caminho será tão feliz quanto eu to pensando(e acredito que não seja).

Mas se achar algo, compartilhe ai....

Abraço


2011/2/4 João Fidalgo <pinkfl...@gmail.com>

Diego, onde posso conseguir alguns exemples desse caso?
Estou começando a programar no Android e esse projeto é um desafio para mim.

Obrigado

João Fidalgo

unread,
Feb 4, 2011, 7:58:31 AM2/4/11
to androidb...@googlegroups.com
Se alguem tiver exemplos e tutoriais de todas as opções citadas aqui, por favor me envie.

Obrigado

Douglas Alípio

unread,
Feb 4, 2011, 8:10:32 AM2/4/11
to androidb...@googlegroups.com

[TUTORIAL] Trabalhando com Banco de Dados SQLite no Android


http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=185&sid=0c279dd058bf24945e9520f3ebd9ef82

2011/2/4 João Fidalgo <pinkfl...@gmail.com>

Se alguem tiver exemplos e tutoriais de todas as opções citadas aqui, por favor me envie.

Obrigado



--



Atenciosamente,
Douglas Alípio Mesquita


www.euandroid.com.br
Tutoriais e notícias sobre Android.

Neto Marin

unread,
Feb 4, 2011, 8:11:26 AM2/4/11
to androidb...@googlegroups.com
João,

Vá indo por partes...
Primeiro veja como acessar serviços HTTP. Já fiz um post sobre isso: http://netomarin.com/blog/20100721/android-chamada-http-para-uma-servlet/

Depois, procure entender como funciona a criação de banco de dados no Android, faça uma busca no google vc irá encontrar vários exemplos.

Aí depois, é só juntar os pontos...


[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


2011/2/4 João Fidalgo <pinkfl...@gmail.com>

Wagner Mariotto Bonfiglio

unread,
Feb 4, 2011, 8:37:17 AM2/4/11
to androidb...@googlegroups.com
Realmente o melhor jeito é fazer um WebService no teu servidor onde se encontra o BD.. Eu não sei como funciona pra tratar JSON no Android, mas XML é meio trabalhoso e vale a pena criar um novo tópico aqui na lista quando você chegar nesse ponto! Tenho um exemplo que funciona bem e posso ajudar quando você precisar...

Agora quanto à conexão com o WebService, essa é uma tarefa relativamente simples que você pode buscar facilmente diversos exemplos no Google... Tem também a abordagem que o Neto postou no blog dele que já deve resolver seu problema ;)

Então os passos seriam (onde cada um poderia ser um novo tópico):
1) Criar um WebService (WS) para disponibilizar acesso aos dados do seu BD (essa parte não tem a ver com o Android, mas com a linguagem que você escolher server-side)
2) Fazer a conexão com o WS para buscar os dados
3) Tratar o retorno do WS (JSON ou XML)
4) Criar e manipular o BD (o Douglas mandou um tutorial mas eu achei muito simples, o Android tem classes de gerenciamento de BD que valem a pena ser estudadas)


Att,
Wagner Bonfiglio

2011/2/4 Neto Marin <neto...@gmail.com>

João Fidalgo

unread,
Feb 4, 2011, 9:44:53 AM2/4/11
to androidb...@googlegroups.com
Vou começar a ler isso tudo.

Obrigado pela ajuda.

João Fidalgo

unread,
Mar 7, 2011, 6:13:05 PM3/7/11
to androidb...@googlegroups.com
Galera preciso ressucitar este tópico.
Consegui fazer funcionar a comunicação entre o Android e o Web Service em PHP. Meu WS faz o seguinte, lê um tabela do MySql e produz um JSON.
O problema aparece quando eu precisei usar uma tabela grande, ele gerou um arquivo (JSON) de 4 Megas.
Quando tento sincronizar pelo Android, dá Force Close.
Usando tabelas pequenas funciona muito bem.

Preciso de uma solução para isso.
Eu pensei em converter as tabelas do Mysql para CSV no servidor e fazer o download pelo aplicativo Android. Talvez até usando compactação nessa transferência.

Alguém me sugere alguma solução mais profissional que essa?

Obrigado

Ernani Joppert Pontes Martins

unread,
Mar 7, 2011, 6:27:59 PM3/7/11
to androidb...@googlegroups.com, João Fidalgo
Uma paginação não resolve?

Dae vc faz primeiro um count, pega o total das coisas.

Depois faz vários requests e vai obtendo o progresso do processo até obter tudo, use compressão Gzip na transferência.

Use recursos como LIMIT no mysql para gerar o json.

Acho que assim vc vai ter menos complicação e menos trabalho em ter que mudar o formato dos dados que vc já consome.

Abraço.

2011/3/7 João Fidalgo <pinkfl...@gmail.com>

Dirlei Dionísio

unread,
Mar 7, 2011, 6:36:31 PM3/7/11
to androidb...@googlegroups.com
Olá João,

Não consegui encontrar o lugar onde vi essa informação, mas há um tempo máximo que uma app Android comum pode esperar para uma requisição Http ser completada. Se a sua requisição vai levar mais tempo, é preciso colocá-la dentro de um Serviço, que é tratado de forma diferente pelo Android. Provavelmente esse é o motivo de sua app ser fechada à força.

De qualquer forma, é interessante que downloads longos (4mb, por ex) sejam feitos incrementalmente (como o colega anterior sugeriu).

[ ]'s

--
Dirlei Dionísio
Novo artigo: Como atrair bons programadores
http://MaisQueBomCodigo.blogspot.com

João Fidalgo

unread,
Mar 7, 2011, 7:34:47 PM3/7/11
to androidb...@googlegroups.com
Ernani, como funcionaria nesse caso o LIMIT do Mysql?
Entendi o seguinte, meu WS teria várias requisições ao banco de dados e depois a aplicação Android faria vários downloads pequenos das informações e juntaria tudo depois. É isso?

Atualmente eu pego a resposta toda JSON e coloco numa variável string. Acho que está estourando o espaço de memória.
Olhe abaixo o log do erro:

GC_EXPLICIT freed 777 objects / 45536 bytes in 42ms
Starting activity: Intent { flg=0x20000 cmp=fidalgo.app.droid/.grade }
** Activity (main) Pause, UserClosed = false **
** Activity (grade) Create, isFirst = true **
** Activity (grade) Resume **
Displayed activity fidalgo.app.droid/.grade: 297 ms (total 6289 ms)
GC_FOR_MALLOC freed 6506 objects / 313528 bytes in 51ms
GC_FOR_MALLOC freed 826 objects / 98848 bytes in 35ms
Grow heap (frag case) to 3.076MB for 131088-byte allocation
GC_FOR_MALLOC freed 0 objects / 0 bytes in 45ms
GC_FOR_MALLOC freed 262 objects / 77136 bytes in 44ms
Grow heap (frag case) to 3.254MB for 262160-byte allocation
GC_FOR_MALLOC freed 0 objects / 0 bytes in 46ms
GC_FOR_MALLOC freed 287 objects / 143632 bytes in 44ms
Grow heap (frag case) to 3.621MB for 524304-byte allocation
GC_FOR_MALLOC freed 3 objects / 262216 bytes in 34ms
GC_FOR_MALLOC freed 206 objects / 9480 bytes in 30ms
Grow heap (frag case) to 4.371MB for 1048592-byte allocation
GC_FOR_MALLOC freed 2 objects / 80 bytes in 52ms
GC_FOR_MALLOC freed 509 objects / 547368 bytes in 33ms
Grow heap (frag case) to 5.868MB for 2097168-byte allocation
GC_FOR_MALLOC freed 0 objects / 0 bytes in 44ms
GC_FOR_MALLOC freed 882 objects / 1089552 bytes in 31ms
Grow heap (frag case) to 8.868MB for 4194320-byte allocation
GC_FOR_MALLOC freed 0 objects / 0 bytes in 42ms
GC_FOR_MALLOC freed 1821 objects / 2181544 bytes in 47ms
Grow heap (frag case) to 14.868MB for 8388624-byte allocation
GC_FOR_MALLOC freed 0 objects / 0 bytes in 72ms
GC_FOR_MALLOC freed 3653 objects / 4362928 bytes in 52ms
Forcing collection of SoftReferences for 16777232-byte allocation
GC_FOR_MALLOC freed 0 objects / 0 bytes in 37ms
Out of memory on a 16777232-byte allocation.
"main" prio=5 tid=1 RUNNABLE
  | group="main" sCount=0 dsCount=0 s=N obj=0x400208c0 self=0xcd48
  | sysTid=5383 nice=0 sched=0/0 cgrp=default handle=-1345017784
  at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:~59)
  at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
  at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
  at anywheresoftware.b4a.http.HttpClientWrapper$HttpResponeWrapper.GetString(HttpClientWrapper.java:338)
  at fidalgo.app.droidtv.grade._httpclient1_responsesuccess(grade.java:269)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:521)
  at anywheresoftware.b4a.BA.raiseEvent2(BA.java:99)
  at anywheresoftware.b4a.BA$1.run(BA.java:202)
  at android.os.Handler.handleCallback(Handler.java:587)
  at android.os.Handler.dispatchMessage(Handler.java:92)
  at android.os.Looper.loop(Looper.java:123)
  at android.app.ActivityThread.main(ActivityThread.java:4627)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:521)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  at dalvik.system.NativeStart.main(Native Method)
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x400207e0)
FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:59)
at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
at anywheresoftware.b4a.http.HttpClientWrapper$HttpResponeWrapper.GetString(HttpClientWrapper.java:338)
at fidalgo.app.droidtv.grade._httpclient1_responsesuccess(grade.java:269)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:99)
at anywheresoftware.b4a.BA$1.run(BA.java:202)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
  Force finishing activity fidalgo.app.droid/.grade
Activity pause timeout for HistoryRecord{453dbd78 fidalgo.app.droidtv/.grade}
Process com.svox.pico (pid 5263) has died.
Launch timeout has expired, giving up wake lock!



Obrigado pela ajuda

Ernani Joppert Pontes Martins

unread,
Mar 7, 2011, 7:51:50 PM3/7/11
to androidb...@googlegroups.com, João Fidalgo
João,

O LIMIT funciona como um esquema de paginação.

Ele aceita 1 ou 2 parâmetros, sendo que o primeiro é o registro atual e o segundo a quantidade de registros obtidos.

Numa hipótese explicativa simulamos que vc tenha 10.000 registros no BD.

Vc geraria chamadas de 1000 em 1000 registros

Ao obter, vc armazenaria os mesmos numa base SQLite local ou processaria os mesmos, para não judiar do heap conforme o erro abaixo.

Uma chamada inicial, faria um SELECT count, com os WHERE clauses que usa na query atual.

Obteria com isso a quantidade de 10.000 registros 

A partir deste ponto, vc limitaria suas chamadas de 1.000 em 1.000 registros

Tudo isto seria feito no PHP

O número total pode variar, e a quantidade de registros também, a lógica para isso é simplesmente ir reduzindo o total obtido do que ainda falta obter.

Sendo assim

Primeira consulta

SELECT * FROM tabela LIMIT 0, 1000

Demais consultas

SELECT * FROM tabela LIMIT 1000, 1000
SELECT * FROM tabela LIMIT 2000, 1000
SELECT * FROM tabela LIMIT 3000, 1000
SELECT * FROM tabela LIMIT 4000, 1000
SELECT * FROM tabela LIMIT 5000, 1000
SELECT * FROM tabela LIMIT 6000, 1000
SELECT * FROM tabela LIMIT 7000, 1000
SELECT * FROM tabela LIMIT 8000, 1000
SELECT * FROM tabela LIMIT 9000, 1000

A cada consulta, um processo de geração e consumo do JSON ou XML seria feito, sendo que a operação possa ser segregada, em intervalos numa Thread

O ideal não é fazer o Parse do Webservice e manter nada na memória, mas sim tentar persistir isto em um SQLite dentro do Android, a cada requisição.

Espero ter ajudado

Ernani


2011/3/7 João Fidalgo <pinkfl...@gmail.com>
Reply all
Reply to author
Forward
0 new messages