Gravando os dados da Resposta Json no Sqlite

701 views
Skip to first unread message

Márcio Fornari

unread,
Mar 27, 2014, 7:59:23 PM3/27/14
to androidb...@googlegroups.com
Pessoal, Boa noite!

Estou em um dilema.
Preciso cadastrar os dados de uma resposta Json no meu Banco de dados.
Eu consegui fazer, ta tudo ok, só não sei se é a maneira correta.

Vejam:
Eu hoje estou fazendo assim:
Pego os dados do GSON (vou postar só o codigo que interressa..)
  1. protected void onPostExecute(Void result) {
  2.         super.onPostExecute(result);
  3.                        
  4.         for (GrupoClienteModel grupoclientemodel : this.resposta.GrupoCliente) {
  5.                        
  6.                 String grupo = grupoclientemodel.getNomeGrupocliente().toString();
  7.                                
  8.                 DbAdapter db = new DbAdapter(getApplicationContext());
  9.                 db.open();
  10.                 db.inserirGrupoCliente(grupo);
  11.                 db.close();
  12.                
  13.                 System.out.println("Inseriu Grupo");
  14. }

Então como vcs perceberam eu chamo minha classe DbAdapter que tem os métodos de inserção no banco que é assim:
  1. public void inserirGrupoCliente(String nomeGrupo){
  2.                 this.nomeGrupo = nomeGrupo;
  3.                 ContentValues values = new ContentValues();
  4.                
  5.                 //INSERINDO OS DADOS NA TABELA D_GRUPO_CLIENTE
  6.                 values.put(nome_grupo_cliente, nomeGrupo);
  7.                 mDb.insert(D_GRUPO_CLIENTE, null, values);
  8.  
  9.                 values.clear();
  10. }

Simples assim. Ta funcionando!
Agora vem a minha dúvida:
Vejam que eu não estou usando a classe referente ao GrupoCliente para inserir, não estou utilizando o objeto, está errado isso??
Teria que fazer desse jeito? Passando o objeto no metodo inserirGrupoCliente?

  1. public void inserirGrupoCliente(GrupoClienteModel grupocliente){
  2.         ContentValues values = new ContentValues();
  3.                
  4.         values.put(nome_grupo_cliente, grupocliente.getNomeGrupocliente());
  5. }


Minha classe GrupoClienteModel está assim:

  1. public class GrupoClienteModel {
  2.        
  3.         private String NomeGrupo;
  4.        
  5. public GrupoClienteModel(){
  6.          this.NomeGrupo = "";
  7. }      
  8.         public String getNomeGrupocliente(){
  9.                 return NomeGrupo;
  10.         }
  11.        
  12.         public  void setNomeGrupoCliente(String NomeGrupoCliente){
  13.                  this.NomeGrupo = NomeGrupoCliente;
  14.         }
  15.  
  16. }

Me deem essa dica.

--
............
.Márcio Fornari 
.Bacharel em  Sistemas de Informação
.Contatos pelo Telefone: (49)8814 - 3378
.ou pelo e-mail: marcio...@gmail.com

..........................................................................

Geovani de Souza

unread,
Mar 28, 2014, 9:10:36 AM3/28/14
to androidb...@googlegroups.com
Bom dia Márcio,

Vou dar minha opinião:
- Pq vc grava o JSON no banco? Pq não usa um arquivo no cache? Ele é feito pra isso.
- No POJO GrupoClienteModel, pq o getter e setter se vc não valida nada? Pode usar um campo público, que no caso do Dalvik é até mais performático.
- Pq seu DbAdapter tem que saber o que é um "nomeGrupo"? Lembre-se do princípio de separação de responsabilidades...
- No caso do seu dilema em si, eu optaria por usar o objeto, que seria mais semântico. Leia a linha toda e veja o que vc "sente" mais legível. Lembre-se: Escrevemos código para pessoas, não máquinas ;)

Eu faria o seguinte:

public class GrupoClienteModel {

    public String NomeGrupo;
}

protected void onPostExecute(Void result) {
    super.onPostExecute(result);
                   
    for (GrupoClienteModel grupoclientemodel : this.resposta.GrupoCliente) {
                   
        DbAdapter db = new DbAdapter(getApplicationContext());
        db.open();
        db.inserirGrupoCliente(grupoclientemodel.nomegrupocliente);
        db.close();
       
        System.out.println("Inseriu Grupo");
    }
}

public void inserirGrupoCliente(GrupoClienteModel grupocliente) {
    this.nomeGrupo = nomeGrupo;
    ContentValues values = new ContentValues();
   
    //INSERINDO OS DADOS NA TABELA D_GRUPO_CLIENTE
    values.put(nome_grupo_cliente, grupocliente.NomeGrupo);
    mDb.insert(D_GRUPO_CLIENTE, null, values);
}

Mas claro, isso é só uma sugestão...

Márcio Fornari

unread,
Mar 28, 2014, 8:41:57 PM3/28/14
to androidb...@googlegroups.com
Cara, mto obrigado!
Vou começar a utilizar o ojbeto, pois notei também que se tiver um cadastro de pessoa, vou ter que passar vários parâmetros sendo que posso passar somente o objeto.

Vc me perguntou porque gravar o Json no Banco.
Pois bem, nunca utilizei cache, nem sei por onde começar se for o caso. Mas é que meu aplicativo é um aplicativo de vendas, ou seja, o vendedor faz a conexão via webservice e conforme vai fazendo a conexão ele vai gravando.. 

Não sei se é a melhor forma, tenho que estudar por exemplo se caso na hora da conexão ele receber uma chamada, ou a internet cair, ou o webservice sair do ar, talvez alguém aqui possa me dar umas dicas. 
Mas basicamente é isso, o vendedor entra na activity e pressiona o botão Realizar conexão, o meu objetivo é primeiro Enviar os Pedidos gravados para o webservice e depois ele recebe as atualizações do webservice, onde pego o cadastro de clientes, produtos, promoções, etc, etc.. 


--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Geovani de Souza

unread,
Mar 29, 2014, 9:56:34 AM3/29/14
to androidb...@googlegroups.com
Bom dia Marcio,

Esse cenário local/webservice é muito mais comum do que vc imagina. Pode-se mudar as regras de negócio, o objetivo do aplicativo, mas em resumo, todos fazem algo local pra depois enviar pra algum lugar. É o "modelo padrão" de software hoje em dia, se é que existe algum...rs

Se quiser mais algumas dicas, eu vou te dizer o que uso no meu cenário:

- Retrofit para abstrair a API: Basicamente vc cria uma interface no java, anotando os métodos com url e parâmetros, depois ele faz uma "automágica" e acessa a api através de OO, e já conta com um mecanismo para gestão do cache automático, vc só precisa escolher se quer salvar no banco, no disco ou na memória;
- OkHttp para multiplexar as requisições HTTP, c/ suporte a SPDY: Quando vc tem muitas requisições HTTP ele pode dar um ganho de, no mínimo, 40% no tempo total. Francamente, ainda não achei motivo pra não usar;
- GSON para serialização: Já ouvi benchmarks dizendo que ele até é bom, mas força muito GC na máquina virtual, o que além de deixar o app lento, pode comsumir mais bateria. Eu uso pq é do Google, é confiável e estável;
- Robospice para gerenciar as requisições HTTP: Vc consegue enfileirar dezenas de requisições e com o uso do OkHttp, isso tudo explode em threads, muito rápido. O melhor é q é tudo transparente, vc nem importa uma Thread ou AsyncTask;
- OrmLite para ORM com o banco;
- E um SyncAdapter: não precisamos reinventar a roda. Sério.

No caso desse último, a documentação oficial é bem abrangente, mas não existe um "best practices" sobre como fazer a sincronização, mas eu recomendo que vc dê uma boa olhada e estude esse parte do Android, pois permite que vc elimine completamente a activity com o botão "atualizar": isso fica totalmente automático.

Vc pode deixar somente sincronização em segundo plano, em períodos ou ainda, disparar a sincronização a cada pedido gravado, deixando um delay mínimo. Assim, imagino q não haveria a necessidade dos vendedores "integrarem os pedidos no fim do dia".

Um bônus: Vc também pode usar uma queue como o GCM, RabbitMQ ou Redis e criar um Service no aplicativo que recebe uma "push notification" sobre novos produtos, promoções, etc., e vc baixa pela API apenas o que interessa, com delay de segundos, talvez minutos. ;)

Sobre queda de conexão, etc, vc teria que tratar isso através dos exceptions já fornecidos pelo Retrotif, OkHttp, Robospice e o próprio Android. Vc só precisa checar se o aparelho tem conectividade e "pingar" a API antes de começar.

Se quiser trocar mais ideias, me mande um email.

Luiz Carvalho

unread,
Mar 30, 2014, 9:56:24 AM3/30/14
to androidb...@googlegroups.com
Muito boa resposta Geovani! favoritei aqui!

Márcio Fornari

unread,
Mar 31, 2014, 6:54:09 AM3/31/14
to androidb...@googlegroups.com
Geovani show de bola, certeza que isso vai me ajudar muito, agora bora estudar!

Só uma questão em particular:
-Perfeita essa análise de enviar os pedidos automáticos depois dele gravado, o problema aqui é que nosso vendedores são muito leigos, então prefiro mandar eles enviarem os pedidos do que o app ficar enviando os pedidos todos errados, pois acontece muito, o cara digita o pedido ai depois se lembra que falta algo etc.., ai já é muita confusão hehe.

Obrigado pelas dicas.


--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Geovani de Souza

unread,
Mar 31, 2014, 8:36:09 AM3/31/14
to androidb...@googlegroups.com
Bom dia Márcio,

Entendo esse cenário. Já passei por isso. As opções geralmente são: treinar quem faz errado; impor alguma política de "tolerância zero"; ou aceitar que usuários fazem coisas erradas e nós temos que resolver...

Ainda posso sugerir que, com dois atributos extras em suas tabelas, vc poderia controlar essa situação de atualização, sem abrir mão das "caquinhas" que os inteligentes cometem.

De qualquer forma, se precisar de algo, pergunte aí que tentamos ajudar.
Reply all
Reply to author
Forward
0 new messages