Android Open Source - morpho S Q Lite Template






From Project

Back to project page morpho.

License

The source code is released under:

Apache License

If you think the Android project morpho listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.morpho.android.ws.impl.sqlite;
//from w  w w . j  ava  2s .  c  o m
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Clase de conveniencia para no repitir cdigo relacionado con transacciones de SQLite.
 * 
 * @author Daniel Pedraza-Arcega
 * @since 1.0
 */
class SQLiteTemplate {

    private static final String TAG = SQLiteTemplate.class.getSimpleName();

    private final SQLiteOpenHelper databaseHelper;

    /**
     * Construye un nuevo SQLiteTemplate.
     * 
     * @param databaseHelper el objeto SQLiteOpenHelper a usar.
     */
    SQLiteTemplate(SQLiteOpenHelper databaseHelper) {
        this.databaseHelper = databaseHelper;
    }

    /**
     * Ejecuta una consulta en la base de datos para recuperar un solo resultado.
     * 
     * @param <T> el tipo del objeto a regresar.
     * @param sql la sentencia SQL a ejecutar.
     * @param rowMapper el objeto que mapear el resultado de la consulta.
     * @return un objeto tipo T o {@code null} si no hubo resultado o hay ms de un resultado o hubo
     *         errores.
     */
    <T> T queryForSingleResult(String sql, RowMapper<T> rowMapper) {
        return queryForSingleResult(sql, null, rowMapper);
    }

    /**
     * Ejecuta una consulta en la base de datos para recuperar un solo resultado.
     * 
     * @param <T> el tipo del objeto a regresar.
     * @param sql la sentencia SQL a ejecutar.
     * @param args los argumentos que reemplazarn los '?' de la consulta.
     * @param rowMapper el objeto que mapear el resultado de la consulta.
     * @return un objeto tipo T o {@code null} si no hubo resultado, hay ms de un resultado o hubo
     *         errores.
     */
    <T> T queryForSingleResult(String sql, String[] args, RowMapper<T> rowMapper) {
        SQLiteDatabase database = null;
        Cursor cursor = null;
        T object = null;
        try {
            database = databaseHelper.getReadableDatabase();
            cursor = database.rawQuery(sql, args);
            if (cursor.getCount() == 1 && cursor.moveToNext()) object = rowMapper.mapRow(cursor, 1);
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't complete query [" + sql + "] with args [" + Arrays.deepToString(args) + "]", ex);
        } finally {
            SQLiteUtils.close(cursor);
            SQLiteUtils.close(database);
        }
        return object;
    }

    /**
     * Ejecuta una consulta en la base de datos para recuperar una lista de resultados.
     * 
     * @param <T> el tipo de la lista a regresar.
     * @param sql la sentencia SQL a ejecutar.
     * @param rowMapper el objeto que mapear cada fila del resultado de la consulta.
     * @return una lista con objetos tipo T o una lista vacia si no hubo resultados o {@code null}
     *         si hubo errores.
     */
    <T> List<T> queryForList(String sql, RowMapper<T> rowMapper) {
        return queryForList(sql, null, rowMapper);
    }

    /**
     * Ejecuta una consulta en la base de datos para recuperar una lista de resultados.
     * 
     * @param <T> el tipo de la lista a regresar.
     * @param sql la sentencia SQL a ejecutar.
     * @param args los argumentos que reemplazarn los '?' de la sentencia.
     * @param rowMapper el objeto que mapear cada fila del resultado de la consulta.
     * @return una lista con objetos tipo T, una lista vacia si no hubo resultados o {@code null} si
     *         hubo errores.
     */
    <T> List<T> queryForList(String sql, String[] args, RowMapper<T> rowMapper) {
        SQLiteDatabase database = null;
        Cursor cursor = null;
        ArrayList<T> list = null;
        try {
            database = databaseHelper.getReadableDatabase();
            cursor = database.rawQuery(sql, args);
            list = new ArrayList<>(cursor.getCount());
            int rowNum = 0;
            while (cursor.moveToNext()) list.add(rowMapper.mapRow(cursor, ++rowNum));
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't complete query [" + sql + "] with args [" + Arrays.deepToString(args) + "]", ex);
        } finally {
            SQLiteUtils.close(cursor);
            SQLiteUtils.close(database);
        }
        return list;
    }

    /**
     * Ejecuta una sentencia SQL (INSERT, UPDATE, DELETE, etc.) en la base de datos.
     * 
     * @param sql la sentencia SQL a ejecutar.
     */
    void execute(String sql) {
        SQLiteDatabase database = null;
        SQLiteStatement statement = null;
        try {
            database = databaseHelper.getWritableDatabase();
            database.beginTransaction();
            statement = database.compileStatement(sql);
            statement.execute();
            database.setTransactionSuccessful();
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't execute [" + sql + "]", ex);
        } finally {
            SQLiteUtils.close(statement);
            SQLiteUtils.endTransaction(database);
            SQLiteUtils.close(database);
        }
    }

    /**
     * Ejecuta una sentencia SQL (INSERT, UPDATE, DELETE, etc.) en la base de datos.
     * 
     * @param sql la sentencia SQL a ejecutar.
     * @param statementBinder el objeto que reemplazarn los '?' de la sentencia.
     */
    void execute(String sql, SQLiteStatementBinder statementBinder) {
        SQLiteDatabase database = null;
        SQLiteStatement statement = null;
        try {
            database = databaseHelper.getWritableDatabase();
            database.beginTransaction();
            statement = database.compileStatement(sql);
            statementBinder.bindValues(statement);
            statement.execute();
            database.setTransactionSuccessful();
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't execute [" + sql + "] with args", ex);
        } finally {
            SQLiteUtils.close(statement);
            SQLiteUtils.endTransaction(database);
            SQLiteUtils.close(database);
        }
    }

    /**
     * Ejecuta una sentencia SQL (INSERT, UPDATE, DELETE, etc.) en la base de datos.
     * 
     * @param sql la sentencia SQL a ejecutar.
     * @param args el arreglo de String para enlazar valores.
     */
    void execute(String sql, String[] args) {
        SQLiteDatabase database = null;
        SQLiteStatement statement = null;
        try {
            database = databaseHelper.getWritableDatabase();
            database.beginTransaction();
            statement = database.compileStatement(sql);
            for (int index = args.length; index != 0; index--) {
                statement.bindString(index, args[index - 1]);
            }
            statement.execute();
            database.setTransactionSuccessful();
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't execute [" + sql + "] with args", ex);
        } finally {
            SQLiteUtils.close(statement);
            SQLiteUtils.endTransaction(database);
            SQLiteUtils.close(database);
        }
    }

    /**
     * Ejecuta varias sentencias SQL (INSERT, UPDATE, DELETE, etc.) en la base de datos usando una
     * misma transaccin.
     * 
     * @param sqls las sentencias SQL a ejecutar.
     */
    void batchExecute(String[] sqls) {
        SQLiteDatabase database = null;
        try {
            database = databaseHelper.getWritableDatabase();
            database.beginTransaction();
            for (String sql : sqls) {
                SQLiteStatement statement = database.compileStatement(sql);
                statement.execute();
                statement.close();
            }
            database.setTransactionSuccessful();
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't execute batch " + Arrays.deepToString(sqls), ex);
        } finally {
            SQLiteUtils.endTransaction(database);
            SQLiteUtils.close(database);
        }
    }

    /**
     * Ejecuta varias sentencias SQL (INSERT, UPDATE, DELETE, etc.) en la base de datos usando una
     * misma transaccin.
     * 
     * @param sql las sentencia SQL a ejecutar.
     * @param statementBinder el objeto que reemplazarn los '?' de la sentencia varias veces.
     */
    void batchExecute(String sql, BatchSQLiteStatementBinder statementBinder) {
        SQLiteDatabase database = null;
        SQLiteStatement statement = null;
        try {
            database = databaseHelper.getWritableDatabase();
            database.beginTransaction();
            statement = database.compileStatement(sql);
            for (int i = 0; i < statementBinder.getBatchSize(); i++) {
                statement.clearBindings();
                statementBinder.bindValues(statement, i);
                statement.execute();
            }
            database.setTransactionSuccessful();
        } catch (Exception ex) {
            Log.e(TAG, "Couldn't execute batch [" + sql + "]", ex);
        } finally {
            SQLiteUtils.close(statement);
            SQLiteUtils.endTransaction(database);
            SQLiteUtils.close(database);
        }
    }

    /**
     * Mapea cada una de las filas del objeto Cursor a un objeto tipo T.
     * 
     * @author Daniel Pedraza-Arcega
     * @since 1.0
     * @param <T> el tipo del objeto a mapear.
     */
    static interface RowMapper<T> {

        /**
         * Se debe implementar este mtodo para que se mape cada una de las filas de datos. Este
         * mtodo no debe llamar {@link android.database.Cursor#moveToNext()}.
         * 
         * @param cursor un objeto Cursor que tiene los datos de la fila en curso.
         * @param rowNum la fila en curso (base 1).
         * @return un objeto tipo T.
         */
        T mapRow(Cursor cursor, int rowNum);
    }

    /**
     * Enlaza valores al objeto SQLiteStatement proporcionado para realizar una actulizacin en la
     * base datos.
     * 
     * @author Daniel Pedraza-Arcega
     * @since 1.0
     */
    static interface SQLiteStatementBinder {

        /**
         * Se debe implementar este mtodo para que se enlazen los valores para reemplazar los '?'
         * en la sentencia SQL.
         * 
         * @param statement el objeto para enlazar valores.
         */
        void bindValues(SQLiteStatement statement);
    }

    /**
     * Implementacin de RowMapper que convierte una sola columna en un solo String por fila.
     * 
     * @author Daniel Pedraza-Arcega
     * @since 1.0
     */
    static class SingleColumnRowMapper implements RowMapper<String> {

        private static final int COLUMN_INDEX = 0;

        /** {@inheritDoc} */
        @Override
        public String mapRow(Cursor cursor, int rowNum) {
            return cursor.getString(COLUMN_INDEX);
        }
    }

    /**
     * Implementacin de RowMapper que crea un Map por cada fila, representando todas las columnas
     * como pares de llaves y valores: cada entrada por cada columna con el nombre de la columna
     * como llave.
     * 
     * @author Daniel Pedraza-Arcega
     * @since 1.0
     */
    static class ColumnMapRowMapper implements RowMapper<Map<String, String>> {

        /** {@inheritDoc} */
        @Override
        public Map<String, String> mapRow(Cursor cursor, int rowNum) {
            int columnCount = cursor.getColumnCount();
            Map<String, String> row = new HashMap<>(columnCount);
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                row.put(cursor.getColumnName(columnIndex), cursor.getString(columnIndex));
            }
            return row;
        }

    }

    /**
     * Enlaza valores al objeto SQLiteStatement proporcionado para realizar una actulizacin por
     * lotes en la base datos.
     * 
     * @author Daniel Pedraza-Arcega
     * @since 1.0
     */
    static interface BatchSQLiteStatementBinder {

        /**
         * Se debe implementar este mtodo para que se enlazen los valores para reemplazar los '?'
         * en la sentencia SQL.
         * 
         * @param statement el objeto para enlazar valores.
         * @param i el ndice del lote actual.
         */
        void bindValues(SQLiteStatement statement, int i);

        /** @return el tamao del lote. */
        int getBatchSize();
    }

    /**
     * Provee mtodos tiles para Data Access Objects basados en SQLite.
     * 
     * @author Daniel Pedraza-Arcega
     * @since 1.0
     */
    static abstract class DAOSupport {

        private SQLiteTemplate sqliteTemplate;
        private Context context;

        /** @return el objeto SQLiteTemplate a utilizar en las operaciones. */
        protected SQLiteTemplate getSQLiteTemplate() {
            return sqliteTemplate;
        }

        /** @return el contexto de la aplicacin. */
        protected Context getContext() {
            return context;
        }

        /** @param context el contexto de la aplicacin. */
        public void setContext(Context context) {
            this.context = context;
        }

        /** @param databaseHelper el objeto ayudante para la conexin a SQLite. */
        public void setSQLiteOpenHelper(SQLiteOpenHelper databaseHelper) {
            sqliteTemplate = new SQLiteTemplate(databaseHelper);
        }

        /**
         * Quita los caracteres especiales del query con id dado.
         * 
         * @param resId el id del query.
         * @return un query SQL compilante.
         */
        protected String getSqlString(int resId) {
            return context.getString(resId).replaceAll("\\\\'", "'");
        }
    }
}




Java Source Code List

com.morpho.android.activity.MainActivity.java
com.morpho.android.data.GeoArea.java
com.morpho.android.data.GeoPoint.java
com.morpho.android.data.JSONable.java
com.morpho.android.data.Route.java
com.morpho.android.data.Schedule.java
com.morpho.android.data.Station.java
com.morpho.android.intent.ReceiveTransitionsIntentService.java
com.morpho.android.receiver.VoiceReplyReceiver.java
com.morpho.android.util.Strings.java
com.morpho.android.ws.AsyncTaskAdapter.java
com.morpho.android.ws.Buses.java
com.morpho.android.ws.MorphoRequest.java
com.morpho.android.ws.Schedules.java
com.morpho.android.ws.Stations.java
com.morpho.android.ws.impl.MorphoClientFactory.java
com.morpho.android.ws.impl.sqlite.BusesSQLite.java
com.morpho.android.ws.impl.sqlite.MorphoSQLiteOpenHelper.java
com.morpho.android.ws.impl.sqlite.SQLFileParser.java
com.morpho.android.ws.impl.sqlite.SQLiteTemplate.java
com.morpho.android.ws.impl.sqlite.SQLiteUtils.java
com.morpho.android.ws.impl.sqlite.SchedulesSQLite.java
com.morpho.android.ws.impl.sqlite.StationsSQLite.java