domingo, maio 22, 2011

Gravando datas no SQLite do Android

HI,

Continuo avançando aqui no exemplo expenses. Hoje consegui gravar a data no banco de dados, graças a Deus.

Depois de muita tentativa e erro e muitas pesquisas no Google, fui achando as soluções.

Primeiro erro que me deparei foi esse: java.text.ParseException: Unparseable date

Tava tentando converter a data da despesa ( uma string ) que tava no formato dd-MM-yyyy para jogar dentro de uma variável do tipo data. Só depois que percebi que tinha esquecido de trocar o traço pela barra deixando o formato assim: dd/MM/yyyy.

Código para converter uma string em data

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date datepayment = formatter.parse(datepaymentText.getText().toString());

datepaymentText é um Button.

O segundo erro que me deparei foi: java.lang.ClassCastException: java.util.Date

Pensei que o problema era na hora de gravar no campo data da tabela. Desabilitei a linha que dá um insert no banco e mesmo assim tava dando esse erro. Então deduzi que o problema era na passagem de parametro. Fiquei pensando, como é que pode passar um campo data para um metódo que tem uma variavel do tipo data e dá erro?

Pesquisando no google descobrir que ao invés de usar a biblioteca java.sql.Date, eu deveria usar java.util.Date. Depois que fiz isso, não deu mais erro.

E nessa mesma busca vi que eu deveria converter essa variável data que tá no formato dd/MM/yyyy para yyyy-MM-dd, que é o formaro do banco de dados.

O código para gravar a data no banco de dados ficou assim:

public long createExpense(Date datepayment){
ContentValues initialValues = new ContentValues();

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
dateFormat.applyPattern("yyyy-MM-dd");

initialValues.put(KEY_DATEPAYMENT, dateFormat.format(datepayment));
return mDb.insert(DB_TABLE, null, initialValues);
}

Deixei só o campo data para exemplificar.

Agora tá beleza, tá gravando e recuperando o campo data

Ficou assim a tela do programa




Espero que possa ser útil.

Páginas que me ajudaram
http://www.guj.com.br/java/76586-converter-um-campo-de-um-text-field-em-date#403825
http://www.guj.com.br/java/36076-converter-string-para-uma-data
http://stackoverflow.com/questions/754684/how-to-insert-a-sqlite-record-with-a-datetime-set-to-now-in-android-application
http://stackoverflow.com/questions/3842509/android-java-datetime-values-from-string-to-long-to-string-issue

Fiquem na Paz!!!

4 comentários:

Eduardo Le Masson disse...
Este comentário foi removido pelo autor.
Eduardo Le Masson disse...

Olá, muito legal o artigo.
Parabéns!

Poderia fornecer os codigos fonte do aplicativo que está no artigo?

Seria muito útil ao meu aprendizado.
Ainda não tenho um telefone com android, estou pensando em pegar o Galaxy Y. Você tem opinião sobre ele?

Um abraço
Eduardo Le Masson

Gustavo Silva Bernardes disse...

Olá, li este artigo e me ajudou muito, porém agora não estou conseguindo recuperar o campo date ao fazer uma consulta no banco de dados. Será que pode me ajudar? Obrigado

dprogrammer disse...

Oi Gustavo, como tá a condição da data na sua consulta?

Se for comparar com o campo, a data passada precisa estar no formato yyyy-MM-dd

Mas você pode formatar as datas

Nesse exemplo eu pego os registro da data atual

strftime('%d/%m/%Y', Vencimento_mov) = strftime('%d/%m/%Y','now')