Sie sind auf Seite 1von 5

Bases de datos SQLite

Una aplicación puede necesitar una base de datos para almacenar y realizar consultas sobre sus
datos. Android permite crear bases de datos con formato SQLite.

Una aplicación puede crear varias bases de datos. Estas bases de datos son privadas a la aplicación;
solamente ella tiene acceso.

Android no proporciona un framework de alto nivel de mapping objeto-relacional. Es preciso


utilizar directamente consultas SQL para crear, gestionar y ejecutar consultas sobre las bases de
datos.

En esta sección, veremos cómo crear una base de datos y agregar una tabla. A continuación veremos
cómo ejecutar consultas. Por último, veremos cómo modificar una base de datos existente.

1. Creación de una base de datos


Android proporciona la clase abstracta SQLiteOpenHelperque permite gestionar la creación y la
actualización de las bases de datos.

Esta clase es abstracta, de modo que hay que crear una clase derivada que herede de ella. Esta
clase derivada debe invocar al constructor padre y pasarle como parámetros el nombre y la versión
de la base de datos. El número de versión se utiliza durante la actualización de la base de datos a
una nueva versión como veremos más adelante.

Heredando de la clase padre SQLiteOpenHelper, la clase derivada debe sobrecargar, entre otros,
el método onCreate. Este método permite especificar las consultas de creación de las tablas de la
base de datos.

Sintaxis

public abstract void onCreate (SQLiteDatabase db)

Ejemplo

public class BDDAssistant extends SQLiteOpenHelper {


private static final int VERSION_BDD = 1;
private static final String NOMBRE_BDD = "miBDD";

public BDDAssistant(Context context) {


super(context, NOMBRE_BDD, null, VERSION_BDD);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE miTabla ( _id INTEGER PRIMARY KEY
AUTOINCREMENT, nombre TEXT );");
}
}

La clase S QLiteOpenHelperproporciona el método getWritableDatabasepara crear y abrir


la base de datos. Esta clase devuelve un objeto de tipo SQLiteDatabaseaccesible en modo de
escritura que permite modificar la base de datos.

Sintaxis

public synchronized SQLiteDatabase getWritableDatabase ()

Una vez terminados la creación y el uso de la base de datos, es preciso cerrarla invocando a
losmétodos close en el objeto de tipo SQLiteDatabase y, a continuación, en el objeto de
tipo SQLiteOpenHelper.
Sintaxis

public void close ()

Ejemplo

BDDAssistant bddAss = new BDDAssistant(this);


SQLiteDatabase bdd = bddAss.getWritableDatabase();
procesamiento(bdd);
bdd.close();
bddAss.close();

La llamada a ge tWritableDatabasepuede devolver un objeto en modo sólo lectura si


existe un problema como por ejemplo un disco lleno. Una vez corregido el problema, una nueva
llamada al método getW ritableDatabasecerrará el objeto en modo sólo lectura y devolverá
un objeto accesible en lectura/escritura.

Es tras la primera llamada al método g etWritableDatabasecuando la base de datos se


crea realmente. Este método ejecutará sucesivamente
los método onC reate, onUpgradeyonOpende la instancia bddAss. Una vez abierta la base
de datos, se pone en caché de modo que las sucesivas llamadas a este método devuelven
directamente la base de datos sin invocar de nuevo a los métodos anteriores.

Para abrir una base de datos en modo sólo lectura, se reemplazará la llamada al
método getWritableDatabasepor el método getReadableDatabase.
Sintaxis

public synchronized SQLiteDatabase getReadableDatabase ()

Ejemplo

SQLiteDatabase bdd = bddAss.getReadableDatabase();

2. Procedimientos y consultas SQL


El objeto de tipo SQLiteDatabaserecuperado en la sección anterior permite ejecutar sentencias y
consultas SQL: CREATE TABLE, DELETE, INSERT… La ejecución de sentencias SQL la realizan los
métodos e xecSQL.
Sintaxis

public void execSQL (String sql)


public void execSQL (String sql, Object[] bindArgs)

Ejemplo

bdd.execSQL("DROP TABLE IF EXISTS miTabla");

Sólo está permitido una sentencia por llamada a estos métodos. El uso de ’;’ para separar las
sentencias está, por tanto, prohibido.

Las consultas SQL pueden ejecutarse con los distintos métodos q uery que reciben distintos
parámetros de entrada como el nombre de la tabla, los nombres de los campos…
Cada uno de estos métodos devuelve un objeto de tipo Cu rsor que permite navegar por los
resultados de la consulta y extraer los datos. El cursor devuelto por el método query se
posicionaantes del primer registro.

Sintaxis

public Cursor query (String table, String[] columns,


String selection, String[] selectionArgs,String groupBy,
String having, String orderBy)

public Cursor query (String table, String[] columns,


String selection, String[] selectionArgs,String groupBy,
String having, String orderBy, String limit)

public Cursor query (boolean distinct, String table,


String[] columns, String selection,String[] selectionArgs,
String groupBy, String having, String orderBy, String limit)

Ejemplo

Cursor cursor = bdd.query("miTabla", new String[] { "_id", "nombre" },


null, null, null, null, "_id desc", 10);

a. Navegar los resultados

La interfaz Cursorprovee todos los métodos que permiten navegar un juego de resultados de una
consulta. El acceso a los registros puede realizarse de forma secuencial (método moveToNext) o
directamente indicando un número de registro (método m oveToPosition).
Observe que no se debe olvidar invocar al método mo veToFirst antes de recorrer
secuencialmente una colección de registros, pues el método query posiciona el cursor antes del
primer registro.

Los principales métodos utilizados para recorrer un juego de registros se enumeran en la tabla a
continuación.

Nombre del método Acción

int getCount() Devuelve el número de registros contenidos en


el cursor.

boolean moveToFirst() Posiciona el cursor sobre el primer registro.

boolean moveToNext() Posiciona el cursor sobre el registro siguiente.


Si el cursor ya estuviera posicionado en el
último registro, el método devolverá false.

boolean isLast() Devuelve true si el registro en curso es el


último, o falseen caso contrario.

boolean isFirst() Devuelve true si el registro en curso es el


primero, o falseen caso contrario.

boolean moveToPosition Posiciona el cursor en la posición que se indica


(int posicion) como parámetro. El primer registro se
encuentra en la posición 0. El rango de valores
aceptados por el parámetro posiciones -1<=
posicion <=count, o desde la
posición isBeforeFirst() hasta la
posición isAfterLast().

b. Lectura de datos
Para leer los datos de un registro - las columnas del resultado de una consulta SQL, la
interfaz Cursorexpone tantos métodos como tipos de datos posibles existen en una base de
datos SQLite.

En estos métodos, la columna que se quiere leer se indica como parámetro, mediante su índice. La
primera columna tiene el índice 0, y la última columna tiene el índice getColumnCount() - 1.
A continuación se muestra una tabla resumen de los métodos más utilizados para la lectura de un
registro.

Nombre del método Acción

int getColumnCount() Devuelve el número de columnas para el


registro.

int getColumnIndex(String Devuelve el índice de la columna cuyo nombre


nombreColumna) se pasa como parámetro.

double getDouble(int Devuelve el valor de la columna cuyo índice se


indiceColumna) pasa como parámetro. Produce una excepción
float getFloat(int si el dato no es del tipo indicado, o si el valor
indiceColumna) es null.
long getLong(int
indiceColumna)
int getInt (int
indiceColumna)
short getShort(int
indiceColumna)
String getString(int
indiceColumna)
byte[] getBlob(int
indiceColumna)
boolean Devuelve true si el valor de la columna
isNull(indexindiceColumna) es null.

3. Actualizaciones
Tras la creación de una nueva versión de la aplicación, es posible que la base de datos necesite
evolucionar, creando por ejemplo nuevas tablas, o modificando tablas existentes. Es preciso, en
estos casos, realizar una actualización de la base de datos.

Android integra un mecanismo específico que ayuda a actualizar la base de datos: en primer lugar se
invoca a uno de los métodos ge tReadableDataBase y getWritableDataBase, el sistema
compara el número de versión en curso (que se pasa como parámetro en la llamada del constructor
padre S QLiteOpenHelper) con el valor devuelto por el método getVersion. Si ambos números
de versión difieren, se invoca al método onUpgrade.
Basta, por tanto, con sobrecargar el método onUpgradecuya sintaxis es la siguiente:

Sintaxis

public abstract void onUpgrade (SQLiteDatabase db, int oldVersion,


int newVersion)

Ejemplo

public class BDDAssistant extends SQLiteOpenHelper {


private static final int VERSION_BDD = 2;
...
public BDDAssistant(Context context) {
super(context, NOMBRE_BDD, null, VERSION_BDD);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
...
}
}

Los usuarios no actualizan, necesariamente, las aplicaciones instaladas en su dispositivo con cada
nueva publicación, por lo que es importante gestionar, mediante el método onUpgrade, las posibles
actualizaciones desde cualquier número de versión.

Una de las formas de gestionar estas actualizaciones incrementales es escribir un bucle que vaya
desde oldVersion hasta newV ersion, y gestionar cada etapa con la ayuda de una
instrucción switch. Un posible esquema del método onUpgradepodría ser el siguiente:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
for(int indiceVersion =oldVersion ; indiceVersion <newVersion;
indiceVersion ++) {
int nextVersion = indiceVersion+1;
switch(nextVersion) {
case 2 :
// actualización para la versión 2
break;
case 3 :
// actualización para la versión 3
break;
...
}
}

Por último, para asegurar que la base de datos se mantiene en un estado conocido en caso de error
de actualización, se recomienda ejecutar el conjunto de instrucciones de actualización dentro de la
misma transacción.

Una transacción se inicia mediante el método be ginTransactiondel objeto SQLiteDatabase.


En caso de éxito, una llamada al método s etTransactionSuccessful del mismo objeto
permitirá indicar al sistema que las transacciones pueden confirmarse. El
método en dTransaction finaliza la transacción: si setTransactionSuccessful se hubiera
invocado anteriormente, los cambios se aplicarán (acción commit). En caso contrario, no se aplicará
ningún cambio a la base de datos (acción rollback).

La llamada al método onUpgrade se realiza tras la ejecución de los


métodos getR eadableDatase y getWritableDatabase. El tiempo de actualización
puede ser largo. En este caso, es preciso lanzar esta operación desde un thread distinto al thread
principal (véase el capítulo Concurrencia, seguridad y red - Programación concurrente).

Das könnte Ihnen auch gefallen