Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] Re: Dúvida Context requerido no construtor do Banco de Dados SQLite.

Jade, obrigado pela ajuda.


Eu havia começado a fazer outras coisas e acabei por não implementar de imediato a classe Singleton. Eu nunca trabalhei com esse tipo, procurei alguns exemplos na internet, mas tem uma maneira correta de fazer isto voltado para o Contexto em específico no Android?

Obrigado pela atenção desde já.

On Wednesday, November 28, 2012 1:21:54 AM UTC-2, Jade Costa wrote:
Não guarde o Context no seu objeto Parcelable.

Faça uma classe que extenda Application;
Declare ela no manifesto;
Use-a para acessar o singleton da application context, quando precisar de um e não quiser passar o da Activity (chamando getApplicationContext() na Activity).



Em 26 de novembro de 2012 15:54, Guilherme Bernardi <gui.ber...@gmail.com> escreveu:
Entendi, obrigado Rafael.

Eu estou com um problema na passagem do context para uma classe que implementa Parcelable.

Eu só consegui fazer a classe manter a propriedade Context preenchida se eu setá-la através do método Grava() da classe de Pedido e passando o Contexto carregado na classe do Pedido.

for(int i = 0; i < this.getItensCount(); i++) {
this.Itens.get(i).setContextoPedidoItem(this.getContextoPedido());
this.Itens.get(i).Grava();
}

Acredito que é por causa da classe estar implementando Parcelable.
Eu tenho a propriedade de Contexto na Classe PedidoItem.

Só que nos métodos:

public PedidoItem(Parcel in) {
// TODO Auto-generated constructor stub
this.setNumero(in.readInt());
this.setItem(in.readInt());
this.setTipoVenda(in.readInt());
this.setProduto(in.readString());
this.setQtde(in.readFloat());
this.setValor(in.readFloat());
this.setDesconto(in.readFloat());
this.setAcrescimo(in.readFloat());
this.setQtdeAmarelo(in.readFloat());
this.setQtdeAzul(in.readFloat());
this.setQtdeRosa(in.readFloat());
this.setQtdeVerde(in.readFloat());
}

e

@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeInt(this.getNumero());
dest.writeInt(this.getItem());
dest.writeInt(this.getTipoVenda());
dest.writeString(this.getProduto());
dest.writeFloat(this.getQtde());
dest.writeFloat(this.getValor());
dest.writeFloat(this.getDesconto());
dest.writeFloat(this.getAcrescimo());
dest.writeFloat(this.getQtdeAmarelo());
dest.writeFloat(this.getQtdeAzul());
dest.writeFloat(this.getQtdeRosa());
dest.writeFloat(this.getQtdeVerde());
}

Não estou encontrando uma forma de passar a propriedade do tipo Context para o Parcel. Então ela é zerada após isso ficando null.

Já utilizou Parcelable, ou sabe como posso resolver isto?

On Monday, November 26, 2012 3:32:40 PM UTC-2, rafael...@novaprolink.com.br wrote:
Utilize getApplicaitonContext() ao invés de getBaseContext() , assim vc utilizará o contexto global da aplicação ao invés do contexto da activity. Por ser ligado à Activity, ao ter sua activity destruída e recriada posteriormente, este contexto vai impedir que a anterior seja coletada pelo GC.
O Contexto é utilizado basicamente para obter dados dos Resources da aplicação, como strings, temas, layouts, etc... A aplicação possui um, e cada Activity também. O Application context não pode ser utilizado para criar componentes visuais, mas pras demais operações é o mais indicado pra evitar leaks como mencionei acima.

Rafael

Em segunda-feira, 26 de novembro de 2012 14h27min44s UTC-2, Guilherme Bernardi escreveu:
Boa tarde pessoal.

Estou desenvolvendo um aplicativo com banco de dados SQLite e é o meu primeiro no caso.
Gostaria de entender algumas coisas que no mínimo são bem iniciantes acredito eu. Se alguém puder me ajudar eu ficarei muito grato.

1 - Já desenvolvi aplicativos antes, mas qual seria a definição exatamente do Context que é muito utilizado em instâncias pelo aplicativo todo e etc?

2 - Agora a dúvida quanto ao SQLite. No construtor do banco de dados, é exigido um parâmetro de context:
 - new DbHelper(context, nomeBanco, factory, versaoBanco, scriptSQLCreate, scriptSQLDelete)

Eu estou trabalhando com uma classe de Persistencia que é responsável pela comunicação com a classe do Banco de Dados e por persistir os dados no banco de dados.

Então no método de Grava() da Persistencia eu criei uma propriedade:
private Context Contexto;

E nas sub-classes por exemplo Pedido, eu criei também uma propriedade de Contexto. Que é carregada no OnCreate da Activity do CadastroPedido, quando a classe é instanciada:
pedido = new Pedido(getBaseContext());

E no método Grava() da classe de Pedido, que faz um Override do método Grava() da classe de Persistencia, eu preencho os atributos da Persistencia incluindo o Contexto:
this.setContexto(this.getContextoPedido());

Após carregar as propriedades da persistencia incluindo o Contexto e chamando o método Grava():
super.Grava();

No método grava() da classe de persistência eu instancio o Banco de dados, passando o contexto carregado na propriedade da persistência, que passei através das classes:
DataBase = new DadosBD(this.getContexto());

E então trabalho com os dados carregados, fazendo inserção, atualização ou deleção dos dados.

Esta é a maneira correta de trabalhar com esse Contexto exigido pelo SQLite?

Se é a maneira correta, estou tendo problemas para passá-lo através de uma classe de implementa Parcelable.

Obrigado desde já.

--
 
 



--
Jade Moreira da Costa

--
 
 

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário