PDA

Ver la Versión Completa : Fallos con SQLITE


dfarias
24-03-2014, 18:45:52
Buenos días, tardes o noches. Ya estoy perdido en el tiempo después de 5 días tratando de hacer funcionar mi primera app con sqlite. Trate de realizar el ejemplo que propone embarcadero y otros tantos que he visto en la web y no solo que no logro que funcione sino que hay errores que no entiendo su causa. En primer lugar quiero comentar que todas la pruebas las hago con XE5 y en un Nexus 7 con 32Gb.

La primera cuestión es por que al hacer el deploy con la base de datos al querer consultarla (btnConectar) aparece vacía como si recién fuese creada . El archivo esta transferido porque como se ve en el código primero verifico si existe.

Además al ver el contenido de la carpeta (btnVerDirectorio) puedo ver que existe junto a otros archivos .jpg que están en el deploy. Pero si consulta la base esta vacia (btnVerBaseSqlite).

El segundo problema que encuentro es que si la base no existe no debería crearla según el parametros FalIFexist='True'(btnConectar). Pues la crea y además me permite agregarle registros(btnCrearTabla) y también consultarlo(btnVerRegistros). Pero al volver a ejecutar la app la base ya no existe.

procedure TForm4.btnConectarClick(Sender: TObject);
begin
if not FileExists( TPath.Combine(TPath.GetDocumentsPath , trim(edit1.text))) then
showmessage('No existe:'+ TPath.Combine(TPath.GetDocumentsPath, trim(edit1.text)));
Dbase.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath, trim(edit1.text)); //'Dbase.s3db');
dbase.Params.Values['ColumnMetadataSupported'] := 'False';
dbase.Params.Values['FailIfMissing']:='True';
try
dbase.Connected := true;
showmessage('Conexión Establecida !!!!');
except
on E: EDatabaseError do
ShowMessage('Exception raised with message' + E.Message);
end;
end;


procedure TFOrm4.VerDirectorio(DirPath:string);
var
DirList: TStringDynArray;
s: string;
begin
// DirPath := TPath.GetDocumentsPath;
memo1.Lines.Add('Directorio de busqueda: ' + DirPath);
if TDirectory.Exists(DirPath, True) then
begin
// Get all files. Non-Windows systems don't typically care about
// extensions, so we just use a single '*' as a mask.
DirList := TDirectory.GetFiles(DirPath, '*');
// If none found, show that in memo
if Length(DirList) = 0 then
memo1.Lines.Add('Archivos no encontrados en: ' + DirPath)
else
begin
for s in DirList do
memo1.Lines.Add(s);
end;
end
else
memo1.Lines.Add('Directory does not exist.');
end;


procedure TForm4.VerBaseSqliter;
var
results: TDataSet;
query: String;
begin
query:='SELECT * FROM sqlite_master';
try
dbase.Execute(query,nil,results);
except
on E: EDatabaseError do
ShowMessage('Exception raised with message' + E.Message);
end;
while NOT results.Eof do
begin
archivos.Lines.Add(results.FieldByName('tbl_name').AsString);
results.Next;
end;
End;


procedure TForm4.btnCrearTablaClick(Sender: TObject);
begin
dbase.ExecuteDirect('create table if not exists productos (id int(5) primary key not null, detalle char(30));');
dbase.ExecuteDirect('insert INTO productos VALUES (1,"detalle 1");');
dbase.ExecuteDirect('insert into productos values (2,"detalle 2");');
end;


procedure TForm4.btnVerRegistrosClick(Sender: TObject);
var
results:TDataset;
begin
try
dbase.Execute('select * from productos', nil, results);
except
on E: Exception do
showmessage( 'Exception raised with message: ' + E.Message);
end;
while NOT results.Eof do
begin
archivos.Lines.Add(results.FieldByName('detalle').AsString);
results.Next;
end;
results.Close;
end;


La verdad que entre tantos problemas y las ciento de pagina visitadas tanto lo poco de Firemoky como lo abundate de Sqlite ya estoy totalmente confuso y no sé que mas puedo hacer. Si alguien me puede ayudar o guiarme a algo concreto para investigar se lo agradecería infinitamente.

Ñuño Martínez
24-03-2014, 19:07:28
Te he modificado el mensaje para recuperar el formato del código fuente, que lo habías perdido. Revisalo a ver si está bien.

mamcx
24-03-2014, 19:34:23
Y el mensaje de error?

dfarias
24-03-2014, 20:18:28
Muchas gracias ñuño si es lo que digo que ya estoy mareado. Mamcx los errores son los comentados y que la aplicación no realiza segun lo programado.

Ñuño Martínez
25-03-2014, 21:14:34
Creo que mamcx pregunta por cuáles son esos errores, qué mensajes te indican y en qué circunstancias.

dfarias
26-03-2014, 10:58:39
Como comento al principio del mensaje son estos:

1-Al hacer un deploy de un base con 4Mb al abrirla por que aparece vacia?.
2-Por que siempre crea la base si no existe aún con el parametro FailIfMissing=True?
3-Si al crear la base y agregar registros por que al reiniciar la applicacion no estan?

Casimiro Notevi
26-03-2014, 11:14:07
¿Porque será otra base de datos?

Ñuño Martínez
26-03-2014, 12:05:28
Acaba de ocurrírseme: ¿no estará SQLITE configurado para que elimine o vacíe la base de datos al cerrar la aplicación? Como si fuera una base de datos temporal.

dfarias
26-03-2014, 19:08:18
Creo que para hacerlo temporal hay que especificarlo en la query. Ejem. "create TEMP table_name"... Y como veras el código no hace eso. Salvo que exista otra manera que desconozca.
Casimiro por eso he puesto un botón donde consulta los archivos para ver si existe. Y efectivamente esta porque el deploy la ha instalado.