Spanish Problema al guardar datos rápidamente en SqLite

carlos7000

Well-Known Member
Licensed User
Longtime User
Hola a todos.

Estoy tratando de guardar en un base de datos, algunos de los datos que obtengo del gps.

Con el siguiente código no tengo problemas.

B4X:
Query = "INSERT INTO `GpsData`(`Id`,`UnixTime`,`Lat`,`Lon`,`Speed`,`Bearing`) VALUES (NULL,'" & UnixTime & "','" & Lat & "','" & Lon & "','" & Speed & "','" & Bearing & "');"
Sql1.ExecNonQuery(Query)

infortunadamente el código se ejecuta muy lento. En promedio toma un 1 segundo su ejecución.

Buscando la forma de mejorar el rendimiento escribi este nuevo codigo:

B4X:
Sql1.BeginTransaction
Sql1.ExecNonQuery2("INSERT INTO GpsData VALUES(NULL,?,?,?,?,?)", Array As String(UnixTime, Lat, Lon, Speed, Bearing))   
Sql1.EndTransaction

El código se ejecuta rápidamente. En promedio el tiempo de ejecución es de 50 Milésimas de segundo, pero al revisar la Base de datos, no hay datos.

Ni en el teléfono, ni en el log, hay registro de algún error.

Cual puede ser el problema?
 

musaso

Active Member
Licensed User
Yo Utilizo DBUtils, me va bastante bien.

B4X:
Public Sub AnadirLugar
   Dim ListOfMaps As List
   ListOfMaps.Initialize
  
   Dim m As Map
   m.Initialize
   m.Put("UnixTime", "1234") 'Ejemplo
   m.Put("Lat", "lugar") 'Lugar
   m.Put("Lon", "Lo que sea")
   --------- etc, etc
   ListOfMaps.Add(m)
   DBUtils.InsertMaps(BDatos, Tabla, ListOfMaps) 'Nombre de tabla.....
End Sub
 

carlos7000

Well-Known Member
Licensed User
Longtime User

Hola

Como hay mas usuarios que hablan ingles, coloque ese post en el foro de dicho idioma, con la esperanza de que si no recibía respuesta en español, por lo menos lo haría en ingles.

La respuesta del foro en ingles, me sirvió para refrescar la memoria, no recordaba la linea Sql1.TransactionSuccessful, pero aun el programa almacena la información muy lentamente.

Saludos.
 

josejad

Expert
Licensed User
Longtime User
Has probado en distintos teléfonos? A ver si el problema fuera el tuyo, es raro que no sea algo que se comentara ya en el foro sí es algo común.
Sí quieres sube un proyecto de prueba y probamos y te decimos resultados
 

IdasI4A

Active Member
Licensed User
Longtime User
Me parece que te falta poner
B4X:
SQL1.TransactionSuccessful
Justo despues del INSERT. Hay que indicar que la Transacción ha tenido éxito.

Como pone en la ayuda:
B4X:
SQL1.BeginTransaction
Try
    'block of statements like:
    For i = 1 to 1000
        SQL1.ExecNonQuery("INSERT INTO table1 VALUES(...)
    Next
    SQL1.TransactionSuccessful
Catch
    Log(LastException.Message) 'no changes will be made
End Try
SQL1.EndTransaction
 

EnriqueGonzalez

Well-Known Member
Licensed User
Longtime User
abrir una transaccion y cerrarla para un solo INSERT (o cualquier sentencia que afecte la base) es un OVERKILL, las transacciones sirven para 2 o mas inserts, si hacen el trabajo mas rapido pero para una sentencia debe ser el mismo tiempo.

si esta lento, es probable que tu base no este optimizada o tengas muchos datos o este corrupta, prueba la velocidad con una base nueva
 
Top