Mostrando postagens com marcador sqlite. Mostrar todas as postagens
Mostrando postagens com marcador sqlite. Mostrar todas as postagens

segunda-feira, maio 14, 2012

Obter o id do último registro inserido no SQLite

HI,

Precisei pegar o id ( do tipo auto increment ) do registro que estava inserindo.

Pesquisando no google, achei essas dicas:

Get last inserted value from sqlite database Android
http://stackoverflow.com/questions/4017903/get-last-inserted-value-from-sqlite-database-android

Meu código ficou assim: this.Id = dbHelper.db.insert(DB_TABLE, null, values);

Fiquem na Paz!!!

terça-feira, dezembro 13, 2011

Percorrendo os registros de uma consulta no Sqlite

HI,

Precisei num programa para Android, percorrer todos os registros que uma consulta.

Pesquisei como implementar um while e achei esse código


Cursor cur = db.query("tbl_countries", null, null, null, null, null, null);
        cur.moveToFirst();
        while (cur.isAfterLast() == false) {
            view.append("n" + cur.getString(1));
           cur.moveToNext();
        }
        cur.close();

o restante do código se encontra aqui
http://www.higherpass.com/Android/Tutorials/Accessing-Data-With-Android-Cursors/2/


Fiquem na Paz!!!!

sexta-feira, dezembro 02, 2011

Problema com acentuação no Sqlite do Android

HI,

Estava com esse probleminha na rotina de importação do arquivo no formato csv. As palavras acentuadas eram gravadas no banco de dados com os caracteres acentuados com uma interrogação no seu lugar. A palavra Atenção por exemplo, era gravada com Aten??o.

Depois de muito procurar, acabei achando essa solução

Android - make sure the SQLite uses UTF-8 as charset
http://stackoverflow.com/questions/4276215/android-make-sure-the-sqlite-uses-utf-8-as-charset/6002118#6002118


Fiquem na Paz!!!!

quinta-feira, outubro 20, 2011

Alterando a quebra de linha de um campo no Sqlite

HI,

Precisei trocar a quebra de linha de um campo aonde é armazenada uma observação. O problema é que o usuário pode digitar com quebra de linha e quando exporta o arquivo txt, o registro fica em mais de uma linha no arquivo.

Para solucionar, tive que dá um replace no select para trocar a quebra de linha por um espaço.

Achei a dica aqui

How to remove carriage returns in a text field in sqlite?
http://stackoverflow.com/questions/4642535/how-to-remove-carriage-returns-in-a-text-field-in-sqlite


Fiquem na paz!!!

segunda-feira, agosto 29, 2011

Otimizando o processo de insert de muitos registros no Android

HI,

A rotina de importação que implementei usando o ContentValues... put... insert... ficou uma carroça puxada por lesmas. Vou ter que refazer tudo. Procurei por dicas no google e achei bons materiais. Ainda vou implementar.

Aconselho uma lida nesse testo

Database Speed Comparison
http://www.sqlite.org/speed.html

Achei dua maneiras, e as duas tem que ter controle de transação.

How to speed up multiple inserts in SQLite
http://www.tanguay.info/web2008/codeExample.php?id=728

Android: Using DatabaseUtils.InsertHelper for faster insertions into SQLite database
http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/

Tem esse outro texto também sobre como otimizar

SQLite Optimization FAQ
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html


Acredito que eu passe a utilizar esse código


try {
    mDb.beginTransaction();
    for (Value value : values) {
        ih.prepareForInsert();
        ih.bind(colIdx, value.getSomeValue());
        // ...
        ih.execute();
    }
    mDb.setTransactionSuccessful();
} finally {
    mDb.endTransaction();
}

editando

Achei esse código e estou utilizando ele. Passou de uns 15 minutos para menos de 1, hehehe.

Notes on Android SQLite bulk insert
http://sagistech.blogspot.com/2010/07/notes-on-android-sqlite-bukl-insert.html


Fiquem na Paz!!!

quarta-feira, agosto 24, 2011

Controle de transação no SQLite

HI,

Precisei colocar um controle de transação em uma rotina do sistema para Android que estou desenvolvendo.


db.beginTransaction();
try {
db.execSQL(...);
db.execSQL(...);
db.setTransactionSuccessful();
} finally {

db.endTransaction();
}


achei aqui essa dica
http://groups.google.com/group/android-developers/browse_thread/thread/ebe11a0fada35754

outro exemplo
http://www.helloandroid.com/tutorials/database-transactions

Fiquem na Paz!!!

domingo, maio 22, 2011

Obtendo o Banco de Dados do emulador Android

HI,

Essa dica é para obter o banco de dados que está no emulador.

Acessem esse site

Precisei manipular o banco de dados para saber como excluir um campo da tabela, criar uma trigger, etc.

Não dá para usar o comando alter table drop column no android. É preciso renomear a tabela, criar uma nova com o mesmo nome, depois dá um select insert para pupular a nova tabela e depois excluir a tabela que foi renomeada.

Fica assim o comando

db.execSQL("ALTER TABLE \"main\".\"expenses\" RENAME TO \"oXHFcGcd04oXHFcGcd04_expenses\"");

db.execSQL("CREATE TABLE \"main\".\"expenses\" (\"_id\" integer PRIMARY KEY ,\"description\" text NOT NULL ,\"value\" number(9,2) NOT NULL );");

db.execSQL("INSERT INTO \"main\".\"expenses\" SELECT \"_id\",\"description\",\"value\" FROM \"main\".\"oXHFcGcd04oXHFcGcd04_expenses\";");

db.execSQL("DROP TABLE \"main\".\"oXHFcGcd04oXHFcGcd04_expenses\";");


Fiquem na Paz!!!

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!!!

sexta-feira, maio 20, 2011

Campo data com valor padrão no SQLite

HI,

Ainda tou engatinhando no Android, levando uns tombos, mas graças a Deus eu tou conseguindo avançar.

No exemplo de controle de despesas já coloquei um spinner para indicar o tipo de pagamento da despesa.



Agora a minha batalha é colocar o campo data dessa despesa. Estava incluindo no SQLite Manager, extensão do firefox, um campo do tipo data e selecionei para não ter valor null, e quando se faz isso, temos obrigação de informar um valor padrão. Tinha colocado SYSDATE, mas não deu certo.

Pesquisando no google, encontrei uma solução usando uma trigger para atualizar a data antes de inserir.

CREATE TABLE foo (
id NUMBER NOT NULL,
created DATE);

CREATE TRIGGER insert_date AFTER INSERT ON foo
BEGIN
UPDATE foo SET created = DATETIME('NOW') WHERE rowid = new.rowid;
END;


Só que dessa maneira aí, o campo vai ser atualizado, mesmo que eu informe a data na tela.

Modifiquei a trigger para testar se o campo está vazio, se tiver, atualiza a data atual do banco.

CREATE TRIGGER insert_date AFTER INSERT ON foo
BEGIN
UPDATE foo SET created = DATETIME('NOW') WHERE rowid = new.rowid and new.created is null;
END;

Agora vou tentar colocar o campo data no formulário.

Espero que possar ser úitl, fiquem na Paz