Autor Tópico: Windev Mobile + SQLite  (Lida 7764 vezes)

eduardowolak

  • Full Member
  • ***
  • Mensagens: 146
  • Karma: +0/-0
Windev Mobile + SQLite
« Online: Julho 20, 2012, 11:27:10 am »
Bom dia pessoal, essa semana tive que fazer uma carga de dados na minha aplicacao do Android com SQLite, e foi incrivelmente lento o SQLite na inclusão, e lendo a documentação do SQLite descobri que é assim mesmo, ou seja, ele preserva por padrão a integridade dos dados, bom, mas para fazer a carga de dados que eu precisava não poderia demorar tanto, precisava desligar a integridade para que isso ocorre-se num tempo ágil.

Lendo a documentação e o google, achei dois parametros, um é o "synchronous" e outro é o "journal_mode", o segundo desliga totalmente a integridade, num teste básico a minha carga de dados com 40 mil registros levava 53 segundos, utilizando esses parametros levaram 1 segundo. Claro, sem integridade nenhuma. Segue os exemplos.

Para desativar a integridade.

HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;")
HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA journal_mode = OFF;")

Seu bloco de inclusão aqui...

Para ativar os parametros por default novamente.

HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = FULL;")
HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA journal_mode = DELETE;")


Pronto!, uma inclusão praticamente instantanea.

Wolak.

maddog_pa

  • Full Member
  • ***
  • Mensagens: 240
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #1 Online: Novembro 19, 2012, 12:02:52 pm »
Amigo bom dia

         vc sabe de algum data browser para sqllite para que eu possa estar usando... estamos comecando com o desenvolvimento dele e preciso verificar as informacoes dentro, se estao gravadas corretamente!

eduardowolak

  • Full Member
  • ***
  • Mensagens: 146
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #2 Online: Novembro 19, 2012, 12:19:22 pm »
eu uso o LINQPAD, é free, e eu apenas baixei o driver do SQLite.

zerloti

  • Jr. Member
  • **
  • Mensagens: 78
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #3 Online: Novembro 22, 2012, 10:05:39 am »
Ola Wolak ...
Excelente ajuda !!!, mas fiquei com algumas duvidas ...

A fonte da carga de dados é um arquivo texto?

No bloco de inclusão é feito através de funções nativa da wlanguage "hreset, hadd" ou através de querys "hexecutesql..."

e mais uma vez valeu pela dica...
abraços ...

eduardowolak

  • Full Member
  • ***
  • Mensagens: 146
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #4 Online: Novembro 22, 2012, 10:27:13 am »
"A fonte da carga de dados é um arquivo texto?"
SIM, eu faço o download via HTTPRequest do arquivo texto e incluo no Mobile um a um utilizando o hADD.

"No bloco de inclusão é feito através de funções nativa da wlanguage "hreset, hadd" ou através de querys "hexecutesql...""
o Hexecutesql funciona no simulador, mas no aparelho é outra história!, na versão 18 parece que ficou melhor, então utilize o HADD, HMODIFY... dependendo do tamanho do seu arquivo, vc vai notar uma demora grande na inclusão, mas infelizmente nao achei outra maneira.

Wolak.

zerloti

  • Jr. Member
  • **
  • Mensagens: 78
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #5 Online: Novembro 22, 2012, 02:03:49 pm »
valeu muito obrigado pelo seus esclarecimentos

Sergio Kreutz

  • Newbie
  • *
  • Mensagens: 14
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #6 Online: Junho 13, 2013, 07:48:03 am »
Eduardo, bom dia.

Tenho um problema SÉRIO de lentidão em minhas atualizações via FTP com TXT sobre SQLite.
Creio que seu post me ajudará em muito, mas aqui estão algumas dúvidas:

1. Na função: HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;") o que realmente é para ser colocado em "Query"? Uma query de inclusão dos dados?
2. Tenho "n" tabelas. Essa única função "acelera" os HADD de todas, já que é voltada para a conexão?

Agradeço a atenção e grande abraço!


eduardowolak

  • Full Member
  • ***
  • Mensagens: 146
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #7 Online: Junho 17, 2013, 04:49:36 pm »
Olá.

1. Na função: HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;") o que realmente é para ser colocado em "Query"? Uma query de inclusão dos dados?
Sim, uma query qualquer, "Query is data source"

2. Tenho "n" tabelas. Essa única função "acelera" os HADD de todas, já que é voltada para a conexão?
Essa função na verdade altera o estado do banco de dados, no caso o SQLite passa a não executar o comando Fecth para cada inclusão ou alteração de dados. Eu não sei qual Windev Mobile vc está usando, se for a 18 parece que melhoraram bastante a velocidade dos dados utilizando a função de SQLTransaction.

Sergio Kreutz

  • Newbie
  • *
  • Mensagens: 14
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #8 Online: Julho 05, 2013, 09:23:48 am »
Bom dia Eduardo!

A função retorna erro (Falha na inicialização da Query). A mesma está definida como "Data Source".
Tem mais algum detalhe para que a função seja executada com sucesso?
Obrigado e grande abraço!

Luiz Fernando

  • Jr. Member
  • **
  • Mensagens: 65
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #9 Online: Agosto 31, 2013, 03:26:45 pm »
Eduardo primeiramente obrigado por compartilhar esta solução, mais estou com o mesmo problema do Sergio acima Failure initializing<teste> query

Citar
teste is Data Source


HExecuteSQLQuery(teste,MyConnection1,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;")
HExecuteSQLQuery(teste,MyConnection1,hQueryWithoutCorrection,"PRAGMA journal_mode = OFF;")

tentei tb usar uma query já existente no sistema de consulta , mais o erro persiste, será que alguém teria uma dica...

Obrigado

Luiz Fernando

eduardowolak

  • Full Member
  • ***
  • Mensagens: 146
  • Karma: +0/-0
Re:Windev Mobile + SQLite
« Responder #10 Online: Dezembro 11, 2013, 10:27:01 am »
Olá pessoal!, após receber vários emails com dúvidas em relação aos comandos acima sobre integridade de dados no SQLite resolvi desenvolver uma função que desliga isso no aparelho, sim, o comando HExecuteSQL... funciona  somente no Simulador do Windev, no aparelho dá pau mesmo.... bom, enfim, abaixo segue a função em JAVA aonde vc pode desligar a integridade do SQLite na sua aplicação, essa função só funciona no aparelho!!!, não funciona no Simulador, para utilizar no Simulador vc usa os comandos HExecuteSQLQuery.

Função em JAVA:
Código: [Selecionar]
import android.database.sqlite.*;
import android.content.Context;
import android.util.*;
import android.database.*;
public static String AtivarDesativarIntegridadeSQLite(String sTipo){
String DB_NAME = "O NOME DO SEU ARQUIVO.db";
String alterQuery = "";
SQLiteDatabase db;
try {
db = getContexteApplication().openOrCreateDatabase(DB_NAME, 0, null);
try {
if (sTipo.toLowerCase() == "desativar"){
db.execSQL("PRAGMA synchronous = OFF;");
db.rawQuery("PRAGMA journal_mode = OFF;",null);
}
else{
db.execSQL("PRAGMA synchronous = FULL;");
db.rawQuery("PRAGMA journal_mode = DELETE;",null);
}
db.close();
return "ok";
} catch(SQLException e) {
db.close();
return e.getMessage();
}
} catch (SQLException e) {
return e.getMessage();
}
}

Utilizando a função no seu aplicativo:
Código: [Selecionar]
IF InAndroidSimulatorMode() = False THEN
sErro is string = AtivarDesativarIntegridadeSQLite("desativar")
IF sErro <> "ok" THEN
Error(sErro)
EndProgram()
END
ELSE
        HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA synchronous = OFF;")
        HExecuteSQLQuery(Query,Minhaconexao,hQueryWithoutCorrection,"PRAGMA journal_mode = OFF;")
END

Wolak.