Usuario:ManuelRomero/Android/BBDD
De WikiEducator
< Usuario:ManuelRomero | Android
Revisión a fecha de 05:04 6 ene 2013; ManuelRomero (Discusión | contribuciones)
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
Introducción
- Android dentro del API tiene funcionalidad para gestionar una base de datos SQLite
- Esto hace que no requeramos ningún driver ni instalar un gestor de bases de datos adicional
- SQLite es un motor de bases de datos con una características especiales que le hacen muy atractivas para determinados entornos
- Maneja archivos de pequeño tamaño.
- Requiere poco espacio en tiempo de ejecución (250MB apx)
- no necesita un servidor, no permite concurrencia, está basado en funciones no en servicios, lo que le permite presentar tiempos de respuestas rápidos.
- cumple el estándar SQL-92
- Es Open Source
- Página de referencia http://www.sqlite.org/
Características importantes
- Presenta los siguientes tipos de datos
Si escribes esto al editar... ...este será el resultado.
Tipo | Declaración del tipo |
---|---|
TEXTO | "TEXT" |
NUMERO | "NUM" |
ENTERO | "INT" |
REAL | "" |
- No soporta otros tipos
- No valida los valores o sea que podemos insertar cadenas de texto en un campo de enteros y el sistema no se queja
SQLite y Android
- Acceder a la base de datos implica acceder al sistema de ficheros
- Los ficheros que creemos por defecto se ubicarán el en siguiente directoiro
DATA/data/APP_NAME/databases/FILENAME.
- DATA es el directorio donde ubica los ficheros Enviroment.getDataDirectory()
- APP_NAME nombre de la aplicación
- FILENAME es el nombre del fichero de la base de datos
El API SQLLite
- El API para trabajar con base de datos está definido en los siguientes paquetes
- android.database
- contiene todas las clases para trabajar con bases de datos
- android.database.sqlite
- Aquí tenemos las clases específicas para trabajar con sqlite
- el siguiene paquete android.database.sqlite *http://developer.android.com/reference/android/database/sqlite/package-summary.html
- Clases del paquete
- SQLiteClosable
- SQLiteCursor
- SQLiteDatabase
- SQLiteOpenHelper
- SQLiteProgram
- SQLiteQuery
- SQLiteQueryBuilder
- SQLiteStatement
- Y las siguientes interfaces
- SQLiteCursorDriver
- SQLiteDatabase.CursorFactory
- SQLiteTransactionListener
Trabajar con Android y SQLLite
Para trabajar con una base de datos debemos realizar unos pasos clásicos
- Crear la base de datos y gestionarla
- Por crear la base de datos entendemos
- Definir la base de datos
- Definir su estructura (tablas y campos)
- Por gestionarla aludo al hecho de hacer operaciones básicas
- Insertar tuplas
- Borrar
- Modificar
- Consultar
- A continuacion vamos a ver como se realizan estas acciones con Android como lenguje y SQLLite como gestor de bases de datos relacional
Crear una base de datos
- Para administar una base de datos tenemos la clase SQLiteDatabase
- Tenemos dos métodos para abrir / crear una base de datos
- La idea es si existe la base de datos la abro, y si no existe la creo
- Tenemos dos manera de interoperar en esta manera
- Usando métodos concretos de la clase SQLiteDatabase concretamente openDatabase u openOrCreateDatabase
- Extendiendo la clase abstracta SQLOpenHelper que es la forma mas habitual y cómo de realizarlo.
SQLiteDatabase
Presenta los siguientes métodos para crear/abrir una base de datos
- openDatabase
- openOrCreateDatabase'
Los parámetros que se pueden pasar son los siguientes
- String path Es el path y nombre de la base de datos
- int flag especifica el modo en el que se abre/crea la base de datos. Sus valores se pueden combinar e.j. OPEN_READWRITE|CREATE_IF_NECESSARY (Especificamos los dos modos).
- OPEN_READWRITE
- OPEN_READONLY
- CREATE_IF_NECESSARY
- NO_LOCALIZED_COLLATORS.
- SQLLiteDatabase.CursorFactory factory
- DatabaseErrorHandler errorHandler
- File file
- En realidad el uso de ambos métodos es similar con el hecho de que en el método openOrCreateDatabase(...) asumimos el flag CREATE_IF_NECESSARY
- Ambos métodos pueden lanzar una excepción SQLiteException En caso de no abrir/crear la base de datos que hay que capturar
Ejemplo
package com.example.agenda; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.widget.Toast; public class Contactos extends Activity { private static final String DATABASE_NAME = "contactos.db"; private String nombreBD; private SQLiteDatabase baseDatos; private String crearTablaContacto= "create table if not exists " + " contacto (codigo integer primary key autoincrement, " + " nombre text not null, telefono text not null unique);"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** Construimos el path para crear la base de datos asegurandonos de la ubicación de los ficheros por defecto será /data/data/com.example.agenda/... */ nombreBD= Environment.getDataDirectory()+"/data/com.example.agenda/"+DATABASE_NAME; setContentView(R.layout.layout_contactos); if (abrirBaseDatos()){ Toast.makeText(this,"Base de datos Abierta ok!! en "+nombreBD,Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this,"ERROR no se ha podido abrir la base de datos!! "+nombreBD,Toast.LENGTH_LONG).show(); } } /** * Método para crear o abrir la base de datos * Retorna un booleano indicando el éxito o fracaso de la acción */ private boolean abrirBaseDatos(){ try{ baseDatos = SQLiteDatabase.openOrCreateDatabase(nombreBD, null); // baseDatos = openDatabase(nombreBD,null,SQLiteDatabase.CREATE_IF_NECESSARY); baseDatos.execSQL(crearTablaContacto); return true; } catch (SQLiteException e){ Log.i("BASE DATOS","Error al abrir o crear la base de datos" + e); return false; } } }//Fin de la clase Contactos
- En el caso anterior alternativamente podemos usar el método openDatabase(...) que vemos en la línea comentada
Trabajar con la clase abstracta SQLiteOpenHelper
- Esta clase nos va a permitir abrir/crear o actualizar una base de datos de forma sencilla
- Presenta una serie de métodos que nos permite realizar operaciones con la base de datos
- Un objeto SQLiteHelperOpen, no es una referencia directa a la base de datos, si no una referencia a un objeto que nos va a ayudar a interactuar con la base de datos (abrirla, crearla, interactuar con ella).
- Los métodos onCreate y onUpdate son abstractos, así que necesariamente los tenemos que implementar
De modo que cuando creemos una clase que va a derivar de la clase SQLiteOpenHelper debemos tener la siguiente estructura
package com.example.contactos1; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class BaseDatos extends SQLiteOpenHelper{ public BaseDatos(Context contexto, String nombreBD, CursorFactory factory, int version) { super(contexto, nameBD, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase baseDatos) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase baseDatos, int versionAntigua, int versioNueva) { // TODO Auto-generated method stub } }
- A continuación explicamos cada método
- El constructor
SQLiteOpenHelper(Context contexto, String nonbreBD, SQLiteDatabase.CursorFactory factory, int version) SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)
- En el constructor lo que debemos hacer es invocar a super(...)
- Este método es muy rápido en ejecución. Aquí no se crea o abre la base de datos. Para tener una referencia a la base de datos abierta, hay que invocar a métodos onRedableDatabase o onWritableDatabase().
- Los parámetros
- Context context Especifica el contexto en el que se va a abrir la base de datos
- String name Identifica el nombre de la base de datos
- SQLiteDatabase.CursorFactory factory
- int version Entero que especificará la versión de la base de datos, útil para indicar al sistema si queremos cambiar de versión, en cuyo caso de invocará al método onUpgrade()
- DatabaseErrorHandler errorHandler Opcional este objeto será utilizado cuando se detecte una corrupción en la base de datos. Las acciones a realizar se implemntarán en el método abstracto onCorruption(SQLiteDatabase bd) de la clase DataBaseErrorHandler
- onCreate
public abstract void onCreate (SQLiteDatabase db)
- Si la base de datos que especificamos en el constructor nombreBD no existe se invoca al método onCreate()
- Aquí es donde crearemos la base de datos y las tablas por primera vez
- Para modificar la estructura de la base de datos (añadir campos o tablas), hay que invocar al método onUpgrade
- Para conseguir este propósito hay que dar una nueva versión a la base de datos.
- onUpgrade
public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
- En este método podemos realizar cualquier modificación en la estructura de las tablase de la base de datos
- ALTER TABLE, DROP son instrucciones SQL para ejecutar aquí
- Si ocurre un error se produce un ROLLBACK y no se hace nada, todas las acciones indicadas en este método se ejecutan como una única transacción.
- Después de ejecutar este método la base de datos se queda con la versión especificada en el parámetro newVersion