Comunidad de diseño web y desarrollo en internet online

As3+Flash: Sqlite asincrono, ¿cómo interrumpir un query lanzado?

Citar            
MensajeEscrito el 16 Abr 2014 06:15 pm
Tengo una mini app que mete una cantidad elevada "x" de registros prefabricados en una bbdd SqLite, simplemente para testear posteriormente en otro programa que usa esa bbdd.

El acceso a la bbdd en esta mini app es síncrono, por lo que la app se queda "pillada" hasta que termina.
Es una simple app de testeo (no es para usuarios), por lo que no es muy importante pero claro, siempre es interesante meter un boton "PARAR" por si acaso, cosa que no consigo.

Supongamos que tenemos 2 botones en pantalla: INICIAR y PARAR. No hay nada más en pantalla.

INICIAR lanza el query que mete p.e. 1000 registros prefabricados nuevos en la BBDD.
PARAR debería interrumpir el query.

¿Cómo puedo hacerlo? Obviamente tengo que abrir la bbdd de forma asincrona, pero no veo ejemplos por internet de "interrumpir" el query lanzado, simplemente al conectar de forma asincrona podemos hacer otras cosas hasta que termine la consulta.

Por daniel69

78 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Abr 2014 10:39 pm
Hace las queries con un timer o con un EnterFrame.
no hay un metodo asincronico para las llamadas, asi que solo te queda reducir el numero de registros que vas a consultar/agregar/borrar. te sirve? siempre podes interrupir un timer o un enterFrame con un flag o removiendo el listener.

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Abr 2014 09:03 am
Todo está en el 1er frame, no uso enterFrame,

Lo que hago es un bucle (con un numero "n" de iteraciones)
Dentro del bucle, creo la query y la lanzo (cada iteración la query varía ligeramente)
Antes de cerrar el bucle, compruebo el valor de una variable de control, si es 1 salgo del bucle, si es 0 el bucle vuelve a ejecutarse (hasta llegar a 'n').


La idea era habilitar un botón que cambia el valor de la vble de control a 1 mientras se ejecuta el bucle, pero como el programa se queda "congelado" no puedo ni pulsarlo.

Por daniel69

78 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Abr 2014 09:58 am
Pues arreglado.

conn.begin(); antes del bucle y conn.commit(); después del bucle

Va rápido no, lo siguiente.

Por lo visto lo que "cuesta" es iniciar y terminar un query (con el acceso al disco y todo eso). Al poner el begin() el query se "guarda" pero no se inicia, de forma que se ejecuta el bucle completo y al llegar al commit() se inicia realmente la transacción y lo hace todo de una.

No acabo de entender exactamente lo que pasa, pero funciona jaja

Por daniel69

78 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Abr 2014 03:26 pm
Claro, la apertura y cierre de una transacción con SQLite es lenta, y mas si estas haciendo una app para mobiles. Tambien creo que el problema reside en la clase File, cualquier pointer que tengas que generar para hacer una consulta sincrónica y come recursos.
Desde mi experiencia, siempre que trabajes con SQLite:
1 - usa consultas parametrizadas (parameters), en vez de literales, ya que obviamente es mas seguro (en un caso MUY raro de injections en app nativa), y aparte te salvan la vida en respetar los tipos de datos (la conversión es automatica).
2 - Como vos lo mencionaste, evita lo más posible las transacciones dentro de un loop... en caso de q estes forzado a hacerlas, hace algun tipo de proxy para hacerlo de forma secuencial, 1 query a la vez (ya sea con un timer, algo q te permita jugar con intervals, o un enterFrame).

De cualquier forma, me alegro que hayas podido solucionar tu problema.

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Abr 2014 03:30 pm
Si estas disconforme con la performance, podríamos ver el código juntos, lamentablemente no soy experto en manejo de DBs, pero quizas te puedo ayudar a optimizar un poco el programa. Cualquier cosa, estamos para darte una mano.

Por rodrigolopezpeker

61 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.