lunes, 6 de octubre de 2014

SQLite

SQLite es una pequeña librería programada en lenguaje C que implementa un completo motor de base de datos multiplataforma que no precisa configuración. Es muy rápido y la ventaja fundamental es que permite utilizar un amplio subconjunto del lenguaje estándar SQL.
Combina el motor y el interfaz de la base de datos en una única biblioteca, y almacena los datos en un único archivo de texto plano. Se trata de una solución muy válida para un entorno local de tráfico moderado.

Compatibilidad

v1

Lo mínimo necesario

Una clase OpenHelper para el acceso a la base de datos e inicialización de la misma:
public class DBOpenHelper extends SQLiteOpenHelper {
       private static final int DATABASE_VERSION = 1;
       private static final String DATABASE_NAME = "hubiqusdb";
      
       private static DBOpenHelper dbOpen;
      
       /**
        * Constructor privado
        * @param context
        */
       private DBOpenHelper(Context context){
             super(context, DATABASE_NAME, null, DATABASE_VERSION);
             dbOpen = this;
       }
      
       /**
        * Obtener una instancia, patrón Singleton
        * @param context contexto
        * @return instancia de la clase
        */
       public static DBOpenHelper getInstance(Context context){
             if (dbOpen == null){
                    new DBOpenHelper(context);
             }
            
             return dbOpen;
       }
      
       /**
        * Llamado de forma automática cuando se accede por primera vez.
        * Incluir aquí todas las creaciones de tablas e inicializaciones
        * @param db objeto para manejar la base de datos
        */
       @Override
       public void onCreate(SQLiteDatabase db) {
             String sql = "CREATE TABLE Usuario ( " +
                "id INTEGER PRIMARY KEY, " +
                "user NVARCHAR(255) NOT NULL, " +
                "pass NVARCHAR(255) NOT NULL, " +
                "recordar bit DEFAULT 1 " +
                ");";
             db.execSQL(sql);
       }
      
       /**
        * Llamado de forma automática cuando se actualiza la versión.
        * Incluir aquí todas las alteraciones de tablas y datos
        * @param db objeto para manejar la base de datos
        * @param oldVer número de versión anterior
        * @param newVer número de nueva versión
        */
       @Override
       public void onUpgrade(SQLiteDatabase db, int oldVer, int newVer) {
            
       }
}

Un objeto SQLiteDatabase para ejecutar operaciones:
//Operaciones de sólo lectura (consultas)
SQLiteDatabase db = DBOpenHelper.getInstance(context).getReadableDatabase();

//Operaciones de lectura/escritura (actualizaciones)
SQLiteDatabase db = DBOpenHelper.getInstance(context).getWritableDatabase();

  • Operaciones básicas, sin necesidad de conocimientos de SQL:
//Conjunto de valores a insertar
ContentValues values = new ContentValues();
values.put("usuario", usuario);
values.put("clave", clave);
values.put("recordar", recordar?1:0);

SQLiteDatabase db = DBOpenHelper.getInstance(context).getWritableDatabase();

//INSERT
//table: tabla
//nullColumnHack: null para insertar todas las columnas
//values: valores a insertar
db.insert("Usuario", null, values);
db.close();

//Conjunto de valores a actualizar
ContentValues values = new ContentValues();
values.put("usuario", usuario);
values.put("clave", clave);
values.put("recordar", recordar?1:0);

SQLiteDatabase db = DBOpenHelper.getInstance(context).getWritableDatabase();

//UPDATE: actualizar un usuario con id determinado
//table: tabla
//values: valores a actualizar
//whereClause: condición que debe cumplir una fila para actualizarse
//whereArgs: parámetros de la condición (si incluye ?)
db.update("Usuario", values, "id=" + id, null);
db.close();

SQLiteDatabase db = DBOpenHelper.getInstance(context).getWritableDatabase();

//DELETE: borrar un usuario con id determinado
//table: tabla
//whereClause: condición que debe cumplir una fila para eliminarse
//whereArgs: parámetros de la condición (si incluye ?)
db.delete("Usuario", "id=" + id, null);
db.close();

Para lanzar una operación de actualización (INSERT, UPDATE, DELETE) en SQL se emplea el método execSQL pasando directamente la operación como cadena de caracteres.

  • Operaciones de consulta para recuperar datos. En este caso se obtendrá un objeto de tipo Cursor para recorrer el conjunto de resultados:
SQLiteDatabase db = DBOpenHelper.getInstance(context).getReadableDatabase();
String[] columnas = {"id", "usuario", "clave", "recordar"};

//SELECT
//table: tabla
//columns: array de columnas a obtener
//selection: indica qué elementos se van a recuperar
//selectionArgs: parámetros de la condición (si incluye ?)
//groupBy: criterio de agrupación
//having: condición sobre la agrupación
//orderBy: orden de los resultados
//limit: número máximo de resultados
c = db.query("usuario", columnas, "id=" + id, null, null, null, null, null);

String res = null;
// Mover al primer resultado
if (c.moveToNext()) {
       res = c.getString(1);
}
                   
c.close();
db.close();

Para lanzar una consulta de datos también se puede realizar directamente en SQL a través del método rawQuery:
SQLiteDatabase db = DBOpenHelper.getInstance(context).getReadableDatabase();

//SELECT: todos los usuarios que comienzan por a
//sql: sentencia
//selectionArgs: parámetros de la condición (si incluye ?)
c = db.rawQuery("SELECT * FROM Usuario WHERE usuario LIKE 'a%'", null);

// Recorrer los resultados
while (c.moveToNext()) {
       ...

Referencias

http://developer.android.com/reference/android/content/ContentProvider.html

No hay comentarios:

Publicar un comentario