Ejemplo Base de Datos SQLite (Android)

S
Salvador Fernández FernándezIngeniero informático

Describ

Introducción
El gestor de bases de datos por defecto de Android es Lite. SQLite es una base de datos
transaccional ligera que ocupa una cantidad muy pequeña de espacio en disco y
memoria, de manera que es la elección perfecta para crear bases de datos en sistemas
operativos para móviles como Android o iOS.

Aspectos a tener en cuenta cuando se maneja SQLite:

   1. SQLite no dispone de control de integridad, por lo que puedes almacenar un
      valor de un cierto tipo en un campo de otro tipo distinto (por ejemplo poner un
      string e un integer o viceversa)
   2. SQLite no gestiona directamente la integridad referencial, no soporta
      restricciones FOREIGN KEY (clave externa) ni sentencias JOIN. No obstante, se
      puede controlar mediante triggers.
   3. El soporte completo de Unicode es opcional y no está instalado por defecto.

En este tutorial crearemos una base de datos simple para almacenar la información
básica de una serie de empleados. La base de datos dispone de:

Tablas

   1. TEmpleados
   2. TDepartamentos

Vistas

   1. vistaEmpleados: para visualizar los empleados y los departamentos de la
      empresa relacionados a los que pertenecen.
Creación de la base de datos SQL
Por defecto, SQLite no dispone de una interfaz gráfica que lo maneje o una aplicación
para gestionar los formularios de la base de datos, por lo que debemos crear nosotros
mismos las bases de datos mediante código. Primeramente, crearemos una clase que
lleve a cabo todas las operaciones necesarias para tratar la base de datos, tales como
crear tablas o insertar y borrar registros. Esa clase será una clase derivada de
SQLiteOpenHelper. Tendremos que sobrecargar los métodos apropiados, en cada
caso, para llevar a cabo la operación deseada. Sólo dispone de dos:

   1. onCreate(SQLiteDatabase db): es invocado cuando se crea la base de datos,
      esto es, cuando creas tablas, campos, vistas o triggers.
   2. onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): es
      invocado cuando se lleva a cabo una modificación de la base de datos, como
      alterar, borrar o crear nuevas tablas.

Nuestra clase tendrá los siguientes campos:

public class BaseDeDatos extends SQLiteOpenHelper {

       static final String nombreBD="BDtrabajadores";

       static    final   String   tablaEmpleados="TEmpleados";
       static    final   String   colID="idEmpleado";
       static    final   String   colNombre="nombreEmpleado";
       static    final   String   colEdad="edad";
       static    final   String   colDept="departamento";

       static    final   String   tablaDepartamentos="TDepartamentos";
       static    final   String   colDeptID="idDept";
       static    final   String   colDeptNombre="nombreDept";
       static    final   String   vistaEmps="vistaEmpleados";




El constructor

       public BaseDeDatos(Context context) {

               super(context, nombreBD, null,33);

       }

El contructor de la superclase tiene los siguientes parámetros:

      Context con: el contexto asociado a la base de datos
      nombreBD: el nombre de la base de datos
      CursorFactory: a veces, podemos usar una clase que      extiende la clase Cursor
       para implementar algunas validaciones extra u operaciones sobre las consultas a
       la base de datos. Si así fuera, pasaríamos una instancia de la clase
       CursorFactory para devolver una referencia a nuestra clase derivada para ser
       utilizada en lugar del cursor por defecto. En este ejemplo, usaremos la interface
Cursor por defecto para recoger los resultados de las consultas, por lo que el
        parámetro es null.
       Version: la versión del esquema de la base de datos. El constructor crea una
        base de datos en blanco con el nombre y el número de versión especificados.




Creando la base de datos
El primer método de la superclase que debemos sobrecargar es
onCreate(SQLiteDatabase db):


@Override
public void onCreate(SQLiteDatabase bd) {

         bd.execSQL("CREATE TABLE "+tablaDepartamentos+" ("+colDeptID+ "
         INTEGER PRIMARY KEY , "+ colDeptNombre+ " TEXT)");

         bd.execSQL("CREATE TABLE "+tablaEmpleados+" ("+colID+" INTEGER
         PRIMARY KEY AUTOINCREMENT, "+ colNombre+" TEXT, "+colEdad+"
         Integer, "+colDept+" INTEGER NOT NULL ,FOREIGN KEY
         ("+colDept+") REFERENCES "+tablaDepartamentos+"
         ("+colDeptID+"));");


         bd.execSQL("CREATE TRIGGER fk_empdept_deptid " +
         " BEFORE INSERT "+" ON "+tablaEmpleados+
         " FOR EACH ROW BEGIN"+ " SELECT CASE WHEN ((SELECT
         "+colDeptID+" FROM "+tablaDepartamentos+" WHERE
         "+colDeptID+"=new."+colDept+" ) IS NULL)"+
         " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
         " END;");


         bd.execSQL("CREATE VIEW "+vistaEmps+
         " AS SELECT "+tablaEmpleados+"."+colID+" AS _id,"+
         " "+tablaEmpleados+"."+colNombre+","+
         " "+tablaEmpleados+"."+colEdad+","+
         " "+tablaDepartamentos+"."+colDeptNombre+""+
         " FROM "+tablaEmpleados+" JOIN "+tablaDepartamentos+
         " ON "+tablaEmpleados+"."+colDept+"
         ="+tablaDepartamentos+"."+colDeptID);

         insertarDepartamentos(bd);

}




El método crea las tablas con sus correspondientes campos, una vista y un trigger. El
método es invocado cuando se crea la base de datos, es decir, cuando la base de datos
no existe en el disco y se ejecuta sólo una vez en el mismo dispositivo: la primera vez
que la aplicación corre en dicho dispositivo.
Modificando el esquema de la base de datos.
A veces, necesitamos alterar el esquema de la base de datos, por ejemplo, añadiendo
nuevas tablas o cambiando los tipos de los campos. Esto se consigue sobrecargando el
método onUpdate(SQLiteDatabase db,int old Version,int newVerison:


@Override
public void onUpgrade(SQLiteDatabase bd, int viejaVersion,
                        int nuevaVersion)
{

              bd.execSQL("DROP TABLE IF EXISTS "+tablaEmpleados);
              bd.execSQL("DROP TABLE IF EXISTS "+tablaDepartamentos);

              bd.execSQL("DROP    TRIGGER   IF EXISTS dept_id_trigger");
              bd.execSQL("DROP    TRIGGER   IF EXISTS dept_id_trigger22");
              bd.execSQL("DROP    TRIGGER   IF EXISTS fk_empdept_deptid");
              bd.execSQL("DROP    VIEW IF   EXISTS "+vistaEmps);
              onCreate(bd);
}

Este método es invocado cuando cambia el número de versión especificado en el
constructor de la clase.

Cuando desees incorporar un cambio en el esquema de la base de datos, tendrás que
cambiar el número de versión en el constructor de la clase. La implementación más
habitual, como en este caso, consiste en borrar (DROP) las tablas, vistas y triggers
creados con anterioridad para crearlos de nuevo.




Manejando claves externas (Foreign-Key)
Hemos mencionado anteriormente que SQLite 3, por defecto, no soporta restricciones
de clave externa. Sin embargo, podemos simular dichas restricciones mediante triggers
(un trigger -o disparador- es un procedimiento que se ejecuta cuando se cumple una
condición establecida al realizar una operación de inserción, actualización o borrado
sobre una base de datos).

Crearemos un trigger que garantice que cuando se inserta un nuevo empleado, el valor
de departamento está presente en la tabla TDepartamentos. La instrucción SQL para
crear un trigger de este tipo tiene el siguiente aspecto:

CREATE TRIGGER fk_empdept_deptid Before INSERT ON TEmpleados
FOR EACH ROW BEGIN
        SELECT CASE WHEN ((SELECT idDept FROM TDepartamentos
                       WHERE idDept = new.departamento ) IS NULL)
                       THEN RAISE (ABORT,'Foreign Key Violation')
        END;
END
Creamos este trigger en el método onCreate tal como sigue:

         bd.execSQL("CREATE TRIGGER fk_empdept_deptid " +
         " BEFORE INSERT "+" ON "+tablaEmpleados+
         " FOR EACH ROW BEGIN"+ " SELECT CASE WHEN ((SELECT
         "+colDeptID+" FROM "+tablaDepartamentos+" WHERE
         "+colDeptID+"=new."+colDept+") IS NULL)"+
         " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
         " END;");




Ejecutando sentencias SQL
Empecemos a ejecutar sentencias SQL básicas. Puedes ejecutar cualquier sentencia
SQL de manipulación de datos que no sea una consulta select, esto es, una operación
insert, delete, o update        mediante una llamada a bd.execSQL(String
sentenciaSQL):

bd.execSQL("CREATE TABLE "+tablaDepartamentos+" ("+colDeptID+
" INTEGER PRIMARY KEY , "+ colDeptNombre+ " TEXT)");




Insertando nuevos registros
Para insertar nuevas filas en la tabla TDepartamentos usamos el siguiente código:

        void insertarDepartamentos(SQLiteDatabase bd)
        {
             ContentValues cv=new ContentValues();
             cv.put(colDeptID, 1);
             cv.put(colDeptNombre, "Ventas");
             bd.insert(tablaDepartamentos, colDeptID,            cv);
             cv.put(colDeptID, 2);
             cv.put(colDeptNombre, "Contabilidad");
             bd.insert(tablaDepartamentos, colDeptID,            cv);
             cv.put(colDeptID, 3);
             cv.put(colDeptNombre, "Informática");
             bd.insert(tablaDepartamentos, colDeptID,            cv);
             bd.insert(tablaDepartamentos, colDeptID,            cv);

        }

Observa que necesitamos invocar al método this.getWritableDatabase() para abrir
una conexión de lectura/escritura con la base de datos. La función
ContentValues.put() tiene dos parámetros: el nombre de la columna y el valor que
se le pasa.
Cambiando valores
Para ejecutar una sentencia update disponemos de dos métodos diferentes:

   1. ejecutar bd.execSQL()
   2. o invocar el método bd.update():


        public int actualizarDatosEmpleado(Empleado emp)
        {
             SQLiteDatabase bd=this.getWritableDatabase();
             ContentValues cv=new ContentValues();
             cv.put(colNombre, emp.getNombre());
             cv.put(colEdad, emp.getEdad());
             cv.put(colDept, emp.getDept());
             return bd.update(tablaEmpleados, cv, colID+"=?", new String
             []{String.valueOf(emp.getID())});

        }

El método update tiene los siguientes parámetros:

   1. String Table: la tabla que contien el registro que queremos modificar
   2. ContentValues cv: el objeto de contenido que tiene los nuevos valores
   3. String where clause: la cláusula WHERE para especificar qué registro
      modificar.
   4. String[] args: los argumetnos de la clásular WHERE



Eliminando registros
Como con update, para ejecutar una sentencia delete disponemos de dos métodos:

   1. ejecutar bd.execSQL()
   2. o invocar el método bd.delete():

       public void eliminarEmpleado(Empleado emp)
        {
              SQLiteDatabase bd=this.getWritableDatabase();
              bd.delete(tablaEmpleados,colID+"=?",
              new String [] {String.valueOf(emp.getID())});
              bd.close();
        }

El método delete tiene los mismo parámetros que el método update.
Ejecutando consultas de selección
Para ejecutar consultas de selección podemos utilizar dos métodos:

   1. ejecutar bd.rawQuery()
   2. o invocar el método db.query()

Para ejecutar una consulta tipo raw para recoger todos los departamentos:

 Cursor getTodosLosDepartamentos()
  {
         SQLiteDatabase bd=this.getReadableDatabase();
         Cursor cur=bd.rawQuery("SELECT "+colDeptID+" as _id,
        "+colDeptNombre+" from "+tablaDepartamentos,new String [] {});
         return cur;
  }

El método rawQuery tiene dos parámetros:

   1. String query: la sentencia select
   2. String[] selection args: los argumentos si el select incluye una cláusula
        WHERE

Notas

   1. El resultado de una consulta se devuelve en un objeto de la clase Cursor.
   2. En una sentencia select si la columna de la clave primaria (el campo id) tiene
      un nombre distino a _id, entonces tienes que emplear un alias de la forma
      SELECT [nombre campo] as _id. En otras palabras, el objeto Cursor espera
      siempre que el campo de la clave primaria tenga como nombre _id, de lo
      contrario, lanzará una excepción.

Otra forma de llevar a cabo una consulta de selección es usando el método
bd.query(). Una consulta para listar los empleados de un determinado departamento
a partir de una vista tendría el siguiente aspecto:

        public Cursor getEmpleadoPorDept(String Dept)
        {
              SQLiteDatabase bd=this.getReadableDatabase();
              String [] columns=new
                        String[]{"_id",colNombre,colEdad,colDeptNombre};
              Cursor c = bd.query(vistaEmps, columns,
              colDeptNombre+"=?", new String[]{Dept}, null, null, null);
              return c;
        }

El método bd.query() tiene los siguientes parámetros:

   1. String Table Name: el nombre de la tabla sobre la que se ejecuta la consulta.
2. String [ ] columns: la proyección de la consulta, es decir, los campos que se
      quieren consultar.
   3. String WHERE clause: la cláusula where; si no hay, pasa el valor null
   4. String [ ] selection args: los parámetros de la cláusula WHERE
   5. String Group by: un string especificando la cláusula group by
   6. String Having: un string especificando una cláusula HAVING
   7. String Order By: un string especificando una cláusula Order By



Manejando cursores
Los resultados de las consultas se recogen en objetos de tipo Cursor. Existen algunos
métodos comunes que podrás utilizar con los cursores:

   1. boolean moveToNext(): avanza el cursor una posición (siguiente registro) en
      la tabla de resultados. Devuelve false si el movimiento supone ir más allá del
      ultimo registro.
   2. boolean moveToFirst(): retrocede el cursor hasta el primer registro del
      conjunto de resultados. Devuelve false si el conjunto de resultados está vacío.
   3. boolean moveToPosition(int position): desplaza el cursor a la posición de
      un determinado registro. Devuelve false si la posición no es alcanzable.
   4. boolean moveToPrevious(): mueve el cursor al registro anterior al actual en el
      conjunto de resultados. Devuelve false si la posición va más allá de la pimera
      fila.
   5. boolean moveToLast(): mueve el cursor al ultimo registro del conjunto de
      resultados. Devuelve false si el conjunto de resultados está vacío.

También existen métodos muy útiles para comprobar la posición actual de un cursor:
boolean        isAfterLast(),       isBeforeFirst,       isFirst,       isLast      y
isNull(columnIndex). Por otra parte, si tienes un conjunto de resultados con un único
registro y necesitas acceder el valor de un determinado campo del mismo se puede
proceder de la siguiente manera:

public int getIDdepartamento(String Dept)
{
         SQLiteDatabase bd=this.getReadableDatabase();
         Cursor c=bd.query(tablaDepartamentos, new String[]{colDeptID+
         " as _id",colDeptNombre},colDeptNombre+"=?", new
         String[]{Dept}, null, null, null);
         c.moveToFirst();
         return c.getInt(c.getColumnIndex("_id"));
}


Tenemos Cursor.getColumnIndex(String ColumnName) para recuperar el índice de
un campo a partir de su nombre. Después, para obtener el valor de una determinada
columna, tenemos el método Cursor.getInt(int ColumnIndex).
Asimismo están los métodos getShort, getString, getDouble, y getBlob para
devolver los valores como un array de bytes. Es una buena práctica cerrar un cursor
después de haberlo usado mediante close().

Recomendados

Metodologia y prototipo por
Metodologia y prototipoMetodologia y prototipo
Metodologia y prototipoArturo Jimenez
8.7K vistas16 diapositivas
Código Java Ecuación cuadrática por
Código Java Ecuación cuadráticaCódigo Java Ecuación cuadrática
Código Java Ecuación cuadráticaCarmen Nereira
1.2K vistas1 diapositiva
Historias de usuario por
Historias de usuarioHistorias de usuario
Historias de usuarioJoan Sebastián Ramírez Pérez
2.3K vistas30 diapositivas
Historias de usuario¿Por qué? ¿Qué son? ¿Cómo son? por
Historias de usuario¿Por qué? ¿Qué son? ¿Cómo son?Historias de usuario¿Por qué? ¿Qué son? ¿Cómo son?
Historias de usuario¿Por qué? ¿Qué son? ¿Cómo son?Miquel Mora
40.3K vistas13 diapositivas
ADMINISTRACION DE LA CONFIGURACION por
ADMINISTRACION DE LA CONFIGURACIONADMINISTRACION DE LA CONFIGURACION
ADMINISTRACION DE LA CONFIGURACIONHERNAN JIMENEZ
3.8K vistas62 diapositivas
SISTEMAS BASADOS EN CONOCIMIENTOS por
SISTEMAS BASADOS EN CONOCIMIENTOSSISTEMAS BASADOS EN CONOCIMIENTOS
SISTEMAS BASADOS EN CONOCIMIENTOSLUIS5111987
10.5K vistas31 diapositivas

Más contenido relacionado

La actualidad más candente

Abstract Factory por
Abstract FactoryAbstract Factory
Abstract FactoryDiego Calderon
6.5K vistas24 diapositivas
Pruebas de sistemas y aceptacion por
Pruebas de sistemas y aceptacionPruebas de sistemas y aceptacion
Pruebas de sistemas y aceptacionAbner Gerardo
115K vistas46 diapositivas
Control de versiones desde Eclipse. por
Control de versiones desde Eclipse.Control de versiones desde Eclipse.
Control de versiones desde Eclipse.Fontyed
4.6K vistas14 diapositivas
Capitulo 6 prototipos por
Capitulo 6 prototiposCapitulo 6 prototipos
Capitulo 6 prototiposMarmgimel Idiaquez
3.3K vistas17 diapositivas
El Proceso de Diseño de Interfaz del Usuario por Ian Sommerville por
El Proceso de Diseño de Interfaz del Usuario por Ian SommervilleEl Proceso de Diseño de Interfaz del Usuario por Ian Sommerville
El Proceso de Diseño de Interfaz del Usuario por Ian SommervilleJuan Pablo Bustos Thames
7.1K vistas35 diapositivas

La actualidad más candente(20)

Pruebas de sistemas y aceptacion por Abner Gerardo
Pruebas de sistemas y aceptacionPruebas de sistemas y aceptacion
Pruebas de sistemas y aceptacion
Abner Gerardo115K vistas
Control de versiones desde Eclipse. por Fontyed
Control de versiones desde Eclipse.Control de versiones desde Eclipse.
Control de versiones desde Eclipse.
Fontyed4.6K vistas
El Proceso de Diseño de Interfaz del Usuario por Ian Sommerville por Juan Pablo Bustos Thames
El Proceso de Diseño de Interfaz del Usuario por Ian SommervilleEl Proceso de Diseño de Interfaz del Usuario por Ian Sommerville
El Proceso de Diseño de Interfaz del Usuario por Ian Sommerville
Unidad 4 Mad Modelado Analisis Casos De Uso por Sergio Sanchez
Unidad 4 Mad Modelado Analisis Casos De UsoUnidad 4 Mad Modelado Analisis Casos De Uso
Unidad 4 Mad Modelado Analisis Casos De Uso
Sergio Sanchez21.7K vistas
Aseguramiento de la calidad del software SQA por Anita Ortiz
Aseguramiento de la calidad del software SQAAseguramiento de la calidad del software SQA
Aseguramiento de la calidad del software SQA
Anita Ortiz26K vistas
Tipos de pruebas de software por Guillermo Lemus
Tipos de pruebas de softwareTipos de pruebas de software
Tipos de pruebas de software
Guillermo Lemus177.3K vistas
Principios Guías y Reglas por gcaicedo
Principios Guías y ReglasPrincipios Guías y Reglas
Principios Guías y Reglas
gcaicedo3.8K vistas
Las diez principales amenazas para las bases de datos por Imperva
Las diez principales amenazas para las bases de datosLas diez principales amenazas para las bases de datos
Las diez principales amenazas para las bases de datos
Imperva14.6K vistas
Explique 7 razones por las cuales considera conveniente el uso de las funcion... por Adrian Ascanio
Explique 7 razones por las cuales considera conveniente el uso de las funcion...Explique 7 razones por las cuales considera conveniente el uso de las funcion...
Explique 7 razones por las cuales considera conveniente el uso de las funcion...
Adrian Ascanio130 vistas
Instrucciones de control por UNEXPO
Instrucciones de controlInstrucciones de control
Instrucciones de control
UNEXPO4.7K vistas
Modelo de desarrollo de software espiral por Marco Tinajero
Modelo de desarrollo de software espiralModelo de desarrollo de software espiral
Modelo de desarrollo de software espiral
Marco Tinajero2.4K vistas
Diseño y Análisis de una Plataforma e-Commerce por ppalos
Diseño y Análisis de una Plataforma e-CommerceDiseño y Análisis de una Plataforma e-Commerce
Diseño y Análisis de una Plataforma e-Commerce
ppalos10.9K vistas
Ingeniería de requisitos e ingeniería de requerimientos por Cesar Prado
Ingeniería de requisitos e ingeniería de requerimientosIngeniería de requisitos e ingeniería de requerimientos
Ingeniería de requisitos e ingeniería de requerimientos
Cesar Prado9.4K vistas
Modelado basados en escenarios por UCATEBA
Modelado basados en escenariosModelado basados en escenarios
Modelado basados en escenarios
UCATEBA7.5K vistas
Paradigmas de programacion por yamy matin
Paradigmas de programacionParadigmas de programacion
Paradigmas de programacion
yamy matin60.9K vistas

Destacado

CONEXION A LA BASE DE DATOS SQLITE A TRAVES DE UNA APLICACION MOVIL ANDRO... por
CONEXION A  LA BASE DE DATOS  SQLITE A TRAVES DE UNA APLICACION  MOVIL  ANDRO...CONEXION A  LA BASE DE DATOS  SQLITE A TRAVES DE UNA APLICACION  MOVIL  ANDRO...
CONEXION A LA BASE DE DATOS SQLITE A TRAVES DE UNA APLICACION MOVIL ANDRO...Ivan Petrlik
18.2K vistas20 diapositivas
Práctica nominas por
Práctica nominasPráctica nominas
Práctica nominasSalvador Fernández Fernández
1.7K vistas6 diapositivas
APLICACIONES CREADAS PARA ANDROID por
APLICACIONES CREADAS PARA ANDROIDAPLICACIONES CREADAS PARA ANDROID
APLICACIONES CREADAS PARA ANDROIDKarlozz Patrik Gonzalez May
19.4K vistas49 diapositivas
Conexion a servidor desde android por
Conexion a servidor desde androidConexion a servidor desde android
Conexion a servidor desde androidJose Pablo Ovalle
21.8K vistas19 diapositivas
Manual para crear una aplicación movil en java por
Manual para crear una aplicación movil en javaManual para crear una aplicación movil en java
Manual para crear una aplicación movil en javaWenNdy AlmaZza
13.9K vistas6 diapositivas
Manual para hacer una aplicación móvil en net beans versión 7 por
Manual para hacer una aplicación móvil en net beans versión 7Manual para hacer una aplicación móvil en net beans versión 7
Manual para hacer una aplicación móvil en net beans versión 7Chuyito Alvarado
11.3K vistas9 diapositivas

Destacado(20)

CONEXION A LA BASE DE DATOS SQLITE A TRAVES DE UNA APLICACION MOVIL ANDRO... por Ivan Petrlik
CONEXION A  LA BASE DE DATOS  SQLITE A TRAVES DE UNA APLICACION  MOVIL  ANDRO...CONEXION A  LA BASE DE DATOS  SQLITE A TRAVES DE UNA APLICACION  MOVIL  ANDRO...
CONEXION A LA BASE DE DATOS SQLITE A TRAVES DE UNA APLICACION MOVIL ANDRO...
Ivan Petrlik18.2K vistas
Conexion a servidor desde android por Jose Pablo Ovalle
Conexion a servidor desde androidConexion a servidor desde android
Conexion a servidor desde android
Jose Pablo Ovalle21.8K vistas
Manual para crear una aplicación movil en java por WenNdy AlmaZza
Manual para crear una aplicación movil en javaManual para crear una aplicación movil en java
Manual para crear una aplicación movil en java
WenNdy AlmaZza13.9K vistas
Manual para hacer una aplicación móvil en net beans versión 7 por Chuyito Alvarado
Manual para hacer una aplicación móvil en net beans versión 7Manual para hacer una aplicación móvil en net beans versión 7
Manual para hacer una aplicación móvil en net beans versión 7
Chuyito Alvarado11.3K vistas
Adsl2 y la conección telefónica por julioencalada
Adsl2 y la conección telefónicaAdsl2 y la conección telefónica
Adsl2 y la conección telefónica
julioencalada200 vistas
el software y hardware del X°Ch por estefanilewis
el software y hardware del X°Chel software y hardware del X°Ch
el software y hardware del X°Ch
estefanilewis460 vistas
Charla cancer de mama nov 2015 por csanherk
Charla cancer de mama nov 2015 Charla cancer de mama nov 2015
Charla cancer de mama nov 2015
csanherk841 vistas
Diseño.conceptual.de.bases.de.datos. .jorge.sanchez por Juan Timoteo Cori
Diseño.conceptual.de.bases.de.datos. .jorge.sanchezDiseño.conceptual.de.bases.de.datos. .jorge.sanchez
Diseño.conceptual.de.bases.de.datos. .jorge.sanchez
Juan Timoteo Cori1.5K vistas
Diagramas de flujo pseucódigos y algoritmos por angelicaguas
Diagramas de flujo pseucódigos y algoritmosDiagramas de flujo pseucódigos y algoritmos
Diagramas de flujo pseucódigos y algoritmos
angelicaguas231 vistas
diagramas de flujo pseudocodigos y algoritmos por angelicaguas
diagramas de flujo pseudocodigos  y algoritmosdiagramas de flujo pseudocodigos  y algoritmos
diagramas de flujo pseudocodigos y algoritmos
angelicaguas212 vistas
Android DB por Cesar Cespedes por Lima GTUG
Android DB por Cesar CespedesAndroid DB por Cesar Cespedes
Android DB por Cesar Cespedes
Lima GTUG2.8K vistas

Similar a Ejemplo Base de Datos SQLite (Android)

Ejemplo bbdd sqlite (android) por
Ejemplo bbdd sqlite (android)Ejemplo bbdd sqlite (android)
Ejemplo bbdd sqlite (android)Héctor García Lorenzana
492 vistas9 diapositivas
Buenas por
BuenasBuenas
Buenasgregoriobarberi
209 vistas3 diapositivas
Connection Java por
Connection JavaConnection Java
Connection JavaPercy Zelada Rojas
97 vistas18 diapositivas
Carlos eduardo, documento de aplicacion en android por
Carlos eduardo, documento de aplicacion en androidCarlos eduardo, documento de aplicacion en android
Carlos eduardo, documento de aplicacion en androidyz8001
227 vistas8 diapositivas
Sql android por
Sql   androidSql   android
Sql androidjorgerodriguezsaavedra
40 vistas22 diapositivas
Vb net bd_2005_02 por
Vb net bd_2005_02Vb net bd_2005_02
Vb net bd_2005_02Paul Taco
408 vistas17 diapositivas

Similar a Ejemplo Base de Datos SQLite (Android)(20)

Carlos eduardo, documento de aplicacion en android por yz8001
Carlos eduardo, documento de aplicacion en androidCarlos eduardo, documento de aplicacion en android
Carlos eduardo, documento de aplicacion en android
yz8001227 vistas
Vb net bd_2005_02 por Paul Taco
Vb net bd_2005_02Vb net bd_2005_02
Vb net bd_2005_02
Paul Taco408 vistas
Conexion sql server 2005 java netbeans por jbersosa
Conexion sql server 2005 java netbeansConexion sql server 2005 java netbeans
Conexion sql server 2005 java netbeans
jbersosa4.5K vistas
Bases de Datos en Java - Intro a JDBC por Carlos Hernando
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
Carlos Hernando4.8K vistas
Trabajo grupal - Base de Datos por MIROSLAVY
Trabajo grupal - Base de DatosTrabajo grupal - Base de Datos
Trabajo grupal - Base de Datos
MIROSLAVY194 vistas
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite. por Juan Manuel
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Juan Manuel1.2K vistas
Ejemplo de base de datos y reports con jasper report por jbersosa
Ejemplo de base de datos y reports con jasper reportEjemplo de base de datos y reports con jasper report
Ejemplo de base de datos y reports con jasper report
jbersosa1.8K vistas
instalacion y conexion a base de datos postgrest /java por Ney Rogger Miranda
instalacion y conexion a base de datos postgrest /javainstalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /java
Ney Rogger Miranda2.6K vistas
LABORATORIO DE PROGRAMACIÓN I. por SILVA19_PAMELA
LABORATORIO DE PROGRAMACIÓN I.LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.
SILVA19_PAMELA151 vistas

Más de Salvador Fernández Fernández

Web services por
Web servicesWeb services
Web servicesSalvador Fernández Fernández
2.6K vistas14 diapositivas
Ejemplo de paso de funciones como parámetros a otra función por
Ejemplo de paso de funciones como parámetros a otra funciónEjemplo de paso de funciones como parámetros a otra función
Ejemplo de paso de funciones como parámetros a otra funciónSalvador Fernández Fernández
7.5K vistas2 diapositivas
Ejemplo usopunteros por
Ejemplo usopunterosEjemplo usopunteros
Ejemplo usopunterosSalvador Fernández Fernández
325 vistas1 diapositiva
Solucion ejercicios punteros cadenas-vectores por
Solucion ejercicios punteros cadenas-vectoresSolucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectoresSalvador Fernández Fernández
12.7K vistas10 diapositivas
Ejercicios punteros cadenas-vectores por
Ejercicios punteros cadenas-vectoresEjercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectoresSalvador Fernández Fernández
2.6K vistas6 diapositivas
Diagramas de flujo por
Diagramas de flujoDiagramas de flujo
Diagramas de flujoSalvador Fernández Fernández
161.7K vistas21 diapositivas

Más de Salvador Fernández Fernández(20)

Ejemplo Base de Datos SQLite (Android)

  • 1. Introducción El gestor de bases de datos por defecto de Android es Lite. SQLite es una base de datos transaccional ligera que ocupa una cantidad muy pequeña de espacio en disco y memoria, de manera que es la elección perfecta para crear bases de datos en sistemas operativos para móviles como Android o iOS. Aspectos a tener en cuenta cuando se maneja SQLite: 1. SQLite no dispone de control de integridad, por lo que puedes almacenar un valor de un cierto tipo en un campo de otro tipo distinto (por ejemplo poner un string e un integer o viceversa) 2. SQLite no gestiona directamente la integridad referencial, no soporta restricciones FOREIGN KEY (clave externa) ni sentencias JOIN. No obstante, se puede controlar mediante triggers. 3. El soporte completo de Unicode es opcional y no está instalado por defecto. En este tutorial crearemos una base de datos simple para almacenar la información básica de una serie de empleados. La base de datos dispone de: Tablas 1. TEmpleados 2. TDepartamentos Vistas 1. vistaEmpleados: para visualizar los empleados y los departamentos de la empresa relacionados a los que pertenecen.
  • 2. Creación de la base de datos SQL Por defecto, SQLite no dispone de una interfaz gráfica que lo maneje o una aplicación para gestionar los formularios de la base de datos, por lo que debemos crear nosotros mismos las bases de datos mediante código. Primeramente, crearemos una clase que lleve a cabo todas las operaciones necesarias para tratar la base de datos, tales como crear tablas o insertar y borrar registros. Esa clase será una clase derivada de SQLiteOpenHelper. Tendremos que sobrecargar los métodos apropiados, en cada caso, para llevar a cabo la operación deseada. Sólo dispone de dos: 1. onCreate(SQLiteDatabase db): es invocado cuando se crea la base de datos, esto es, cuando creas tablas, campos, vistas o triggers. 2. onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): es invocado cuando se lleva a cabo una modificación de la base de datos, como alterar, borrar o crear nuevas tablas. Nuestra clase tendrá los siguientes campos: public class BaseDeDatos extends SQLiteOpenHelper { static final String nombreBD="BDtrabajadores"; static final String tablaEmpleados="TEmpleados"; static final String colID="idEmpleado"; static final String colNombre="nombreEmpleado"; static final String colEdad="edad"; static final String colDept="departamento"; static final String tablaDepartamentos="TDepartamentos"; static final String colDeptID="idDept"; static final String colDeptNombre="nombreDept"; static final String vistaEmps="vistaEmpleados"; El constructor public BaseDeDatos(Context context) { super(context, nombreBD, null,33); } El contructor de la superclase tiene los siguientes parámetros:  Context con: el contexto asociado a la base de datos  nombreBD: el nombre de la base de datos  CursorFactory: a veces, podemos usar una clase que extiende la clase Cursor para implementar algunas validaciones extra u operaciones sobre las consultas a la base de datos. Si así fuera, pasaríamos una instancia de la clase CursorFactory para devolver una referencia a nuestra clase derivada para ser utilizada en lugar del cursor por defecto. En este ejemplo, usaremos la interface
  • 3. Cursor por defecto para recoger los resultados de las consultas, por lo que el parámetro es null.  Version: la versión del esquema de la base de datos. El constructor crea una base de datos en blanco con el nombre y el número de versión especificados. Creando la base de datos El primer método de la superclase que debemos sobrecargar es onCreate(SQLiteDatabase db): @Override public void onCreate(SQLiteDatabase bd) { bd.execSQL("CREATE TABLE "+tablaDepartamentos+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+ colDeptNombre+ " TEXT)"); bd.execSQL("CREATE TABLE "+tablaEmpleados+" ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ colNombre+" TEXT, "+colEdad+" Integer, "+colDept+" INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES "+tablaDepartamentos+" ("+colDeptID+"));"); bd.execSQL("CREATE TRIGGER fk_empdept_deptid " + " BEFORE INSERT "+" ON "+tablaEmpleados+ " FOR EACH ROW BEGIN"+ " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+tablaDepartamentos+" WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+ " THEN RAISE (ABORT,'Foreign Key Violation') END;"+ " END;"); bd.execSQL("CREATE VIEW "+vistaEmps+ " AS SELECT "+tablaEmpleados+"."+colID+" AS _id,"+ " "+tablaEmpleados+"."+colNombre+","+ " "+tablaEmpleados+"."+colEdad+","+ " "+tablaDepartamentos+"."+colDeptNombre+""+ " FROM "+tablaEmpleados+" JOIN "+tablaDepartamentos+ " ON "+tablaEmpleados+"."+colDept+" ="+tablaDepartamentos+"."+colDeptID); insertarDepartamentos(bd); } El método crea las tablas con sus correspondientes campos, una vista y un trigger. El método es invocado cuando se crea la base de datos, es decir, cuando la base de datos no existe en el disco y se ejecuta sólo una vez en el mismo dispositivo: la primera vez que la aplicación corre en dicho dispositivo.
  • 4. Modificando el esquema de la base de datos. A veces, necesitamos alterar el esquema de la base de datos, por ejemplo, añadiendo nuevas tablas o cambiando los tipos de los campos. Esto se consigue sobrecargando el método onUpdate(SQLiteDatabase db,int old Version,int newVerison: @Override public void onUpgrade(SQLiteDatabase bd, int viejaVersion, int nuevaVersion) { bd.execSQL("DROP TABLE IF EXISTS "+tablaEmpleados); bd.execSQL("DROP TABLE IF EXISTS "+tablaDepartamentos); bd.execSQL("DROP TRIGGER IF EXISTS dept_id_trigger"); bd.execSQL("DROP TRIGGER IF EXISTS dept_id_trigger22"); bd.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid"); bd.execSQL("DROP VIEW IF EXISTS "+vistaEmps); onCreate(bd); } Este método es invocado cuando cambia el número de versión especificado en el constructor de la clase. Cuando desees incorporar un cambio en el esquema de la base de datos, tendrás que cambiar el número de versión en el constructor de la clase. La implementación más habitual, como en este caso, consiste en borrar (DROP) las tablas, vistas y triggers creados con anterioridad para crearlos de nuevo. Manejando claves externas (Foreign-Key) Hemos mencionado anteriormente que SQLite 3, por defecto, no soporta restricciones de clave externa. Sin embargo, podemos simular dichas restricciones mediante triggers (un trigger -o disparador- es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación de inserción, actualización o borrado sobre una base de datos). Crearemos un trigger que garantice que cuando se inserta un nuevo empleado, el valor de departamento está presente en la tabla TDepartamentos. La instrucción SQL para crear un trigger de este tipo tiene el siguiente aspecto: CREATE TRIGGER fk_empdept_deptid Before INSERT ON TEmpleados FOR EACH ROW BEGIN SELECT CASE WHEN ((SELECT idDept FROM TDepartamentos WHERE idDept = new.departamento ) IS NULL) THEN RAISE (ABORT,'Foreign Key Violation') END; END
  • 5. Creamos este trigger en el método onCreate tal como sigue: bd.execSQL("CREATE TRIGGER fk_empdept_deptid " + " BEFORE INSERT "+" ON "+tablaEmpleados+ " FOR EACH ROW BEGIN"+ " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+tablaDepartamentos+" WHERE "+colDeptID+"=new."+colDept+") IS NULL)"+ " THEN RAISE (ABORT,'Foreign Key Violation') END;"+ " END;"); Ejecutando sentencias SQL Empecemos a ejecutar sentencias SQL básicas. Puedes ejecutar cualquier sentencia SQL de manipulación de datos que no sea una consulta select, esto es, una operación insert, delete, o update mediante una llamada a bd.execSQL(String sentenciaSQL): bd.execSQL("CREATE TABLE "+tablaDepartamentos+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+ colDeptNombre+ " TEXT)"); Insertando nuevos registros Para insertar nuevas filas en la tabla TDepartamentos usamos el siguiente código: void insertarDepartamentos(SQLiteDatabase bd) { ContentValues cv=new ContentValues(); cv.put(colDeptID, 1); cv.put(colDeptNombre, "Ventas"); bd.insert(tablaDepartamentos, colDeptID, cv); cv.put(colDeptID, 2); cv.put(colDeptNombre, "Contabilidad"); bd.insert(tablaDepartamentos, colDeptID, cv); cv.put(colDeptID, 3); cv.put(colDeptNombre, "Informática"); bd.insert(tablaDepartamentos, colDeptID, cv); bd.insert(tablaDepartamentos, colDeptID, cv); } Observa que necesitamos invocar al método this.getWritableDatabase() para abrir una conexión de lectura/escritura con la base de datos. La función ContentValues.put() tiene dos parámetros: el nombre de la columna y el valor que se le pasa.
  • 6. Cambiando valores Para ejecutar una sentencia update disponemos de dos métodos diferentes: 1. ejecutar bd.execSQL() 2. o invocar el método bd.update(): public int actualizarDatosEmpleado(Empleado emp) { SQLiteDatabase bd=this.getWritableDatabase(); ContentValues cv=new ContentValues(); cv.put(colNombre, emp.getNombre()); cv.put(colEdad, emp.getEdad()); cv.put(colDept, emp.getDept()); return bd.update(tablaEmpleados, cv, colID+"=?", new String []{String.valueOf(emp.getID())}); } El método update tiene los siguientes parámetros: 1. String Table: la tabla que contien el registro que queremos modificar 2. ContentValues cv: el objeto de contenido que tiene los nuevos valores 3. String where clause: la cláusula WHERE para especificar qué registro modificar. 4. String[] args: los argumetnos de la clásular WHERE Eliminando registros Como con update, para ejecutar una sentencia delete disponemos de dos métodos: 1. ejecutar bd.execSQL() 2. o invocar el método bd.delete(): public void eliminarEmpleado(Empleado emp) { SQLiteDatabase bd=this.getWritableDatabase(); bd.delete(tablaEmpleados,colID+"=?", new String [] {String.valueOf(emp.getID())}); bd.close(); } El método delete tiene los mismo parámetros que el método update.
  • 7. Ejecutando consultas de selección Para ejecutar consultas de selección podemos utilizar dos métodos: 1. ejecutar bd.rawQuery() 2. o invocar el método db.query() Para ejecutar una consulta tipo raw para recoger todos los departamentos: Cursor getTodosLosDepartamentos() { SQLiteDatabase bd=this.getReadableDatabase(); Cursor cur=bd.rawQuery("SELECT "+colDeptID+" as _id, "+colDeptNombre+" from "+tablaDepartamentos,new String [] {}); return cur; } El método rawQuery tiene dos parámetros: 1. String query: la sentencia select 2. String[] selection args: los argumentos si el select incluye una cláusula WHERE Notas 1. El resultado de una consulta se devuelve en un objeto de la clase Cursor. 2. En una sentencia select si la columna de la clave primaria (el campo id) tiene un nombre distino a _id, entonces tienes que emplear un alias de la forma SELECT [nombre campo] as _id. En otras palabras, el objeto Cursor espera siempre que el campo de la clave primaria tenga como nombre _id, de lo contrario, lanzará una excepción. Otra forma de llevar a cabo una consulta de selección es usando el método bd.query(). Una consulta para listar los empleados de un determinado departamento a partir de una vista tendría el siguiente aspecto: public Cursor getEmpleadoPorDept(String Dept) { SQLiteDatabase bd=this.getReadableDatabase(); String [] columns=new String[]{"_id",colNombre,colEdad,colDeptNombre}; Cursor c = bd.query(vistaEmps, columns, colDeptNombre+"=?", new String[]{Dept}, null, null, null); return c; } El método bd.query() tiene los siguientes parámetros: 1. String Table Name: el nombre de la tabla sobre la que se ejecuta la consulta.
  • 8. 2. String [ ] columns: la proyección de la consulta, es decir, los campos que se quieren consultar. 3. String WHERE clause: la cláusula where; si no hay, pasa el valor null 4. String [ ] selection args: los parámetros de la cláusula WHERE 5. String Group by: un string especificando la cláusula group by 6. String Having: un string especificando una cláusula HAVING 7. String Order By: un string especificando una cláusula Order By Manejando cursores Los resultados de las consultas se recogen en objetos de tipo Cursor. Existen algunos métodos comunes que podrás utilizar con los cursores: 1. boolean moveToNext(): avanza el cursor una posición (siguiente registro) en la tabla de resultados. Devuelve false si el movimiento supone ir más allá del ultimo registro. 2. boolean moveToFirst(): retrocede el cursor hasta el primer registro del conjunto de resultados. Devuelve false si el conjunto de resultados está vacío. 3. boolean moveToPosition(int position): desplaza el cursor a la posición de un determinado registro. Devuelve false si la posición no es alcanzable. 4. boolean moveToPrevious(): mueve el cursor al registro anterior al actual en el conjunto de resultados. Devuelve false si la posición va más allá de la pimera fila. 5. boolean moveToLast(): mueve el cursor al ultimo registro del conjunto de resultados. Devuelve false si el conjunto de resultados está vacío. También existen métodos muy útiles para comprobar la posición actual de un cursor: boolean isAfterLast(), isBeforeFirst, isFirst, isLast y isNull(columnIndex). Por otra parte, si tienes un conjunto de resultados con un único registro y necesitas acceder el valor de un determinado campo del mismo se puede proceder de la siguiente manera: public int getIDdepartamento(String Dept) { SQLiteDatabase bd=this.getReadableDatabase(); Cursor c=bd.query(tablaDepartamentos, new String[]{colDeptID+ " as _id",colDeptNombre},colDeptNombre+"=?", new String[]{Dept}, null, null, null); c.moveToFirst(); return c.getInt(c.getColumnIndex("_id")); } Tenemos Cursor.getColumnIndex(String ColumnName) para recuperar el índice de un campo a partir de su nombre. Después, para obtener el valor de una determinada columna, tenemos el método Cursor.getInt(int ColumnIndex).
  • 9. Asimismo están los métodos getShort, getString, getDouble, y getBlob para devolver los valores como un array de bytes. Es una buena práctica cerrar un cursor después de haberlo usado mediante close().