Asincronismo de la bd sqlite

17 views
Skip to first unread message

Jaume Tugores

unread,
Feb 3, 2019, 6:06:46 PM2/3/19
to desarrolladores-android
Resulta que en el programa de la app tengo una linea que llama a una función en la clase de la basedatos que lo que hace es dar un registro de alta y me devuelve la clave del registro para más adelante poder editar este registro, resulta que la linea que llama a esta función, no espera a que la bd termine el trabajo para devolver la clave del registro, sino que deja que la bd haga su trabajo y pasa a la linea siguiente sin que la bd haya terminado, este asincronismo, es lo natural en los móviles, (he leido), pero esto me crea unos problemas que aunque otras veces he podido resolver, esta vez no lo consigo. He probado a sacar la rutina que hace las llamadas a la bd, del hilo principal y lo he puesto en un intent Service, pero me hace lo mismo, solo se me ocurre el tener que reescribir la clase que hace el trabajo, sacarla de la clase de la base de datos y reescribirla en el mismo intent service, pero no me gusta la idea, es repetir el codigo y además un follón, no se como decirle al hilo principal que espere por ejemplo 1 segundo, a ver si ya habrá terminado la bd... 
Esto en un pc de sobremesa no ocurre, nunca se pasa a la linea siguiente si la actual no ha terminado...(que bien va así...)
Gracias.

Christian Gurdian

unread,
May 27, 2019, 2:35:56 PM5/27/19
to desarrollad...@googlegroups.com
Estas ejecutando en dos lineas distintas, no tienes que cambiar mucho pero te recomiendo que la cadena de conexión de base de datos este en una clase diferente, yo ocupa eventos con hilos y generalmente crear una clase distinta solo para obtener los datos toda el trabajo esta en el hilo, ejemplo:

public List<dataCono> ObtenerDatosRecepcion(Context df , String UniqueID){

List<dataCono> datosCono = new ArrayList<>();

try {
Connection connect = ConexionSQL2.ConnectionHelper(df);

if(connect != null){
Statement st = connect.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM [dbo].[zParqueo] WHERE UniqueID = "+UniqueID);
while (rs.next()) {
dataCono asdf = new dataCono();
asdf.setDerivacion(rs.getString("derivacion"));
asdf.setCantidad(rs.getInt("cantidad"));
asdf.setUniqueID(rs.getInt("UniqueID"));
asdf.setId_parqueo(rs.getInt("id_parqueo"));
datosCono.add(asdf);
}
connect.close();
}else{
Toast.makeText(df.getApplicationContext(),"Registro de conexion invalido, verifique su conexion de datos, hable con su proveedor de servicios", Toast.LENGTH_SHORT).show();
}
return datosCono;
} catch (SQLException e) {
Toast.makeText(df.getApplicationContext(),e.getMessage().toString(), Toast.LENGTH_SHORT).show();
return datosCono;
}
}
Se mantiene la ejecución de hilo 

List<dataCono> listaActiva = miclase().ObtenerDatosConoRecepcion(getApplication(),UniqueID);
dataRecepcionParqueo.setLayoutManager(new LinearLayoutManager(this));
lista = new RecyleViewParque(this,listaActiva);
dataRecepcionParqueo.setAdapter(lista);
Esta es mi recomendación, si tenes mas dudas envíame el código a mi correo para poder ayudarte mas 



--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/b4ac3836-8191-450a-8a84-e858ed029bb9%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.


--
Gracias, christian

Jaume Tugores

unread,
Feb 17, 2020, 12:45:22 PM2/17/20
to desarrollad...@googlegroups.com
Bueno, sigo con el mismo problema, lo había apañado pero después de un tiempo, cuando hay muchos registros tarda demasiado y el usuario se queja, asi que mi parche no sirve, he hecho algunas modificaciones, una es que abro una vez la bd y no la cierro nunca, he puesto el close en el onDestroy de la activity principal, pero no se dispara practicamente nunca.
Lo que hago es que leo ciertos registros de una tabla, los pongo en un cursor y luego recorro este cursor mediante un bucle Do While, por cada registro lo que hago es una inserción o un update en otra tabla, según el registro leido, pues bien resulta que el bucle va demasiado rápido y no espera a que el insert en la bd finalize, el bucle recorre todos los registros pero solo da de alta un 10% de los registros que debería.
He probado de hacer la operacion en un transaccion, pero el resultado es el mismo, mi apaño consistia en que despues del insert hacía un bucle para que esperara y el resultado final era el correcto pero no se porque tarda mucho tiempo, del orden de 1 minuto para 50 registros.
Es cierto que tengo en una sola clase la conexion a la bd y todas las operaciones en inserts y updates, si es posible me gustaría conservarlo asi porque tendría que hacer muchos cambios.
He cambiado la conexión, ahora es asi:

    public synchronized SQLiteDatabase abrirBD() {
if (nHelper == null) nHelper = new BDHelper(nContexto);
nDB = nHelper.getWritableDatabase();
return nDB;
}
Solo se llama 1 vez y se usa la misma conexión para toda la app

Gracias
Reply all
Reply to author
Forward
0 new messages