En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
SQLite en Android: creación y acceso base de datos e inserción de registros
2.
SQLite en Android: creación y acceso base de datos e inserción de registros
Seguimos publicando el tema del curso de programación de Apps con Android Studio donde tratamos el almacenamiento y gestión de datos.
En la anterior publicación, tratamos una de las formas más simples de gestión de datos mediante la clase SharedPreferences, pero esta opción, cuando necesitamos almacenar una cantidad de datos mayor o crear relaciones mas complejas entre ellos, no es adecuada. En esas situaciones, tenemos que recurrir a sistemas de bases de datos, que nos proporcionan mecanismos para almacenar y gestionar grandes volúmenes de datos de forma organizada.
Dentro de los distintos sistemas de bases de datos tanto privativos como libres/open source (Oracle, SQLServer, MySQL, etc) existe uno que se adapta perfectamente a las aplicaciones móviles: SQLite. El principal motivo es que SQLite no requiere mas que un simple fichero para almacenar los datos, ya que la lógica de funcionamiento debe ser implementada por la plataforma que desee interactuar con los datos.
En nuestro caso concreto el SDK Android incluye soporte completo para SQLite. La mayoría de las aplicaciones móviles (tanto en Android como en otros sistemas) incluyen bases de datos SQLite, bien sea para la gestión total de los datos, o bien para al menos gestionar los datos almacenados localmente cuando las aplicaciones son parte de infraestructuras mayores que incluyen bases de datos centralizadas online o servicios Web para la obtención de los datos.
En las próximas publicaciones veremos cómo incluir SQLite en nuestras aplicaciones Android. Empezaremos en ésta explicando la creación de la base de datos, cómo acceder desde la aplicación y como hacer la inserción de registros. Seguiremos en la siguiente, mostrando la actualización, eliminación y consulta de datos.
Posteriormente en esta misma serie, describiremos de forma práctica mediante un proyecto ejemplo, la implementación detallada en una App Android básica.
Para una descripción más detallada de SQLIte, puedes consultar otros tutoriales de Academia Android, donde ya hemos publicado sobre esta base de datos, herramientas de administración asociadas y proyectos ejemplo algo más avanzados. También dispones de un curso online específico, Aplicaciones Android con base de datos SQLite , con recursos adicionales y realización de ejercicios prácticos así como la ayuda de un tutor para resolver tus dudas.
Creación de la base de datos SQLite
El procedimiento recomendado para crear una nueva base de datos SQLite es, de forma esquemática:
- crer una clase que extienda de SQLiteOpenHelper
- sobreescribir en ella el método onCreate() , donde se ejecutará un comando de SQLite para crear las tablas de la base de datos.
- También habría que sobreescribir el método onUpgrade() , el cual se ejecutará cada vez que cambiamos la versión de la base de datos y se usará para migrar los datos de la base de datos anterior a la nueva versión.
- Se creará también el constructor de la clase que no será necesario en principio modificarlo.
A continuación, vamos a crear una base de datos sencilla usando una clase derivada de SQLiteOpenHelper y que la llamaremos MySQLiteHelper.
En esta clase sobreescribiremos el método onCreate() para crear una tabla que llamaremos comments y que estará compuesta por dos campos:
- un entero que actuará como clave primaria para identificar el dato y que se autoincrementará (es recomendable siempre añadir un campo como éste para evitar posibles errores)
- un campo de tipo texto.
El constructor recibirá sólo el contexto de la aplicación pero serán necesario más datos para hacer el constructor de la superclase ( super(context, DB_NAME, null, DB_VERSION) ), que son:
- el contexto
- el nombre de la base de datos
- un objeto CursorFactory que normalmente no lo necesitaremos (lo pondremos a null)
- la versión de la base de datos.
Vamos a ver como quedaría esta clase:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package com.academiaandroid.demodb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { private static final String COMMENTS_TABLE_CREATE = "CREATE TABLE comments(_id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT, comment TEXT)"; private static final String DB_NAME = "comments.sqlite"; private static final int DB_VERSION = 1; public MyOpenHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(COMMENTS_TABLE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } |
Vemos que hemos creado un String con la sentencia SQL a ejecutar para crear una tabla en nuestra base de datos:
1 |
private static final String COMMENTS_TABLE_CREATE = "CREATE TABLE comments(_id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT, comment TEXT)"; |
Además, hemos creado otro String con el nombre que tendrá nuestra base de datos (por convención, se usa la extensión .sqlite para las bases de datos SQLite, aunque no es obligatorio):
1 |
private static final String DB_NAME = "comments.sqlite"; |
y un entero que indicará la versión de nuestra base de datos:
1 |
private static final int DB_VERSION = 1; |
Si este valor se incrementa posteriormente de haber creado la base de datos, se llamará al método onUpgrade() .
En el método onCreate() simplemente ejecutaremos la sentencia que crea nuestra tabla:
1 |
db.execSQL(COMMENTS_TABLE_CREATE); |
Acceso a la base de datos
Una vez tenemos nuestra clase derivada de SQLiteOpenHelper creada, vamos a ver como accedemos a la base de datos desde nuestra aplicación.
Lo primero que tenemos que hacer es crear un objeto de la clase MySQLiteHelper al que le pasamos el contexto (en este caso la referencia de la Activity actual).
A continuación, obtendremos una referencia a la base de datos en sí, y para ello podemos usar dos métodos, getReadableDatabase() o getWritableDatabase() si lo que queremos es sólo consultar datos o, a parte de esto, también modificarlos.
Nuestra Activity principal quedaría así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.academiaandroid.demodb; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyOpenHelper dbHelper = new MyOpenHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); if (db != null) { // Hacer las operaciones que queramos sobre la base de datos } } } |
Inserción de datos
Para insertar datos en una base de datos tendremos dos posibilidades:
Usando el método execSQL() , pasando como parámetro un String con la sentencia SQL necesaria para insertar datos.
Usando el método insert() , pasando tres parámetros:
- el nombre de la tabla
- nombre de la columna, en el caso de que queramos insertar un registro completamente a nulo (normalmente este parámetro lo pondremos a null en la mayoría de los casos)
- un objeto de tipo ContentValues que contendrá los datos a insertar en forma de clave-valor, siendo la clave el nombre de la columna y el valor el dato a insertar en dicha columna.
Vamos a insertar un dato a nuestra base de datos usando ambas posibilidades.
En el caso de usar el método execSQL() quedaría así:
1 |
db.execSQL("INSERT INTO comments (user, comment) VALUES ('Digital Learning','Esto es un comentario insertado usando el método execSQL()')"); |
Y para el caso de usar el método insert() quedaría tal que así:
1 2 3 4 5 |
ContentValues cv = new ContentValues(); cv.put("user", "Academia Android"); cv.put("comment", "Esto es un comentario insertado usando el método insert()"); db.insert("comments", null, cv); |
Vemos que no es necesario insertarle un valor al campo _id ya que lo hemos declarado como autoincrementable, cada vez que añadamos un nuevo comentario se le asignará un id automáticamente.
Añadimos este código en el método onCreate de MainActivity:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package com.academiaandroid.demodb; import android.app.Activity; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyOpenHelper dbHelper = new MyOpenHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); if (db != null) { // Insert con execSQL db.execSQL("INSERT INTO comments (user, comment) VALUES ('Digital Learning','Esto es un comentario insertado usando el método execSQL()')"); // Insert con ContentValues ContentValues cv = new ContentValues(); cv.put("user", "Academia Android"); cv.put("comment", "Esto es un comentario insertado usando el método insert()"); db.insert("comments", null, cv); } } } |