Mostrando entradas con la etiqueta sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta sql. Mostrar todas las entradas

viernes, 3 de junio de 2016

Bases de Datos en Android, aumentando la velocidad de las inserciones.

La pantalla de inicio de una aplicación Android estaba demasiado lenta en el arranque, porque descargaba unos 900 sitios en la base de datos SQLite al comenzar la activad. Yo estaba haciendo una gran cantidad de inserciones SQL, con el propósito de llenar una tabla para poder tener la información disponible de manera offline. Buscando una solución encontré por internet el uso de transacciones explícitas en SQLite para aumentar la velocidad de la inserción en la tabla.

La lista que estaba insertando en la tabla contenía 900 sitios, que debían ser insertados en la base de datos, para después ser ubicados en el mapa. y el tiempo que tomaba era de 16 segundos. Este era mi código inicial:


public void createSites(List<Site> objs) {
    for (Site obj : objs) {
        ContentValues values = obj.getContentValues();
        long insertId = db.insertWithOnConflict(database.TABLE_TYPEPENDING,null,values,SQLiteDatabase.CONFLICT_REPLACE);
    }
}

Después de añadir transacciones explícitas en SQLite, el tiempo paso a menos de un segundo, y la información estaba disponible mucho más rápido.

public void createSites(List objs) {
    try {
        //Inicio la transacción
        db.beginTransaction();
        for (Site obj : objs) {
            ContentValues values = obj.getContentValues();
            db.insertWithOnConflict(database.TABLE_TYPEPENDING, null, values, SQLiteDatabase.CONFLICT_REPLACE);
        }
        //Marca la transacción actual como exitosa
        db.setTransactionSuccessful();
    }catch (SQLException e) {
        Log.e(toString(),"Sql error");
    } finally {
        //Termina la transacción
        db.endTransaction();
    }
}

viernes, 20 de junio de 2014

Eliminar Filas duplicadas en sql

Hoy les traigo un pequeño codigo, para eliminar filas duplicadas, algo bastante sencillo:



delete from {{db}} where {{id}} in (SELECT {{id}} FROM {{db}} GROUP BY {{unique_column}} HAVING COUNT(*) > 1) 

Donde id seria el indice de la tabla, db, el nombre de la tabla, unique_column la columna que debería ser unica.