Cómo guardar datos en Android: Bases de datos (I)

Buenas, la semana pasada empezamos una serie de artículos dedicados a guardar datos en nuestra aplicación y vimos como podíamos guardar nuestros datos de configuración con las SharedPreferences. Esta semana nos ponemos serios y veremos como guardar datos en base de datos.




Android utiliza SQLite, el cual es un motor de base de datos ligero, ideal para dispositivos móviles.
SQLite utiliza el lenguaje SQL para realizar consultas de los datos contenidos en sus tablas. El objetivo de este artículo no es el de aprender a hacer consultas SQL, pero lo poco que hagamos es muy simple y os lo explicaré.

Vamos a continuar con nuestro proyecto holamundo, dentro de la carpeta src, hacemos botón derecho sobre nuestro package "com.examples.holamundo" y creamos una nueva clase a la que vamos a llamar bbdd y que debe heredar de la clase SQLiteOpenHelper, la cual nos ayudará a crear y conectarnos a la base de datos.


Una vez creada la clase, el IDE creará dos métodos: onCreate y onUpdate. Básicamente son utilizados cuando es creada la base de datos y cuando la base de datos detecta que debe hacer una actualización, por ejemplo añadir una tabla nueva o eliminar un campo de una de nuestras tablas.
Además el IDE nos va a decir que nos falta un constructor y nos dice si queremos añadir subrayando el nombre de nuestra clase indicándonos el error, en este caso lo pasamos por alto ya que añadiremos nosotros mismos un contructor un poco mejorado para manejar más cómodamente nuestra clase. El código de nuestro constructor será el siguiente:


private static String name = "bdexample";
private static int version = 1;
private static CursorFactory cursorFactory = null;
 
public bbdd(Context context){
 super(context,name,cursorFactory, version);
}


Lo primero que estamos haciendo aquí es definir el nombre de nuestra base de datos, la versión y un CursorFactory necesario para el constructor del que heredamos. Con estas variables centralizadas aquí, controlaremos desde un único punto la versión de nuestra base de datos o su nombre. Estas variables las utilizamos para llamar al constructor de nuestra clase padre.


Una vez listo el constructor vamos a crear nuestras tablas. Para este ejemplo crearemos dos. Una de usuarios y otra de libros. Vamos a crear una estructura muy sencilla ya que no se trata de complicarlo mucho al principio. Veamos el código:


protected static String TableUsuarios = "usuarios";
protected static String TableLibros = "libros";

private String SQLCreateUsuarios = "CREATE TABLE " + TableUsuarios +  " (id_usuario INT, nombre VARCHAR(1000), email VARCHAR(1000) ) ";
private String SQLCreateLibros = "CREATE TABLE " + TableLibros +  " (id_libro INT, nombre VARCHAR(1000), editorial VARCHAR(1000) )";


Las dos primeras variables que he creado son protected, lo que nos permitirá acceder a ellas desde clases que hereden de esta (esto lo veremos en el artículo siguiente). Estas almacenan el nombre de cada una de nuestras tablas. Las dos últimas son private, por lo que solo serán accesibles desde esta clase y contienen las consultas para crear nuestas tablas.


Como veis esta consulta es muy sencilla, prácticamente leyéndola sabemos lo que hará. Para los que no sepáis SQL os digo que creará las tablas dándole un nombre y los campos que contendrá, dándoles además su tipo correspondiente (VARCHAR(1000), es un String de 1000 caracteres máximo).


Una vez creadas estas variables vamos a decirle a nuestra clase que cuando se cree la base de datos cree también nuestras tablas. Para ello retomamos el método onCreate que se creó al principio y escribimos el siguiente código dentro de él.


@Override
public void onCreate(SQLiteDatabase db) {
 db.execSQL(SQLCreateUsuarios);
 db.execSQL(SQLCreateLibros);
}



De esta forma, la primera vez que se cree una instancia de nuestra clase, detectará que no está creada la base de datos y creará nuestras dos tablas.


Ya tenemos creadas las tablas, ahora vamos a insertar datos. Crearemos un método public en nuestra clase que nos permita insertar usuarios (sólo lo hago para esta tabla pero el de la tabla libros será muy parecido). Veamos como sería el código:


public void insertarUsuario(int idUsuario, String nombre, String email){
 SQLiteDatabase db = getWritableDatabase();
 if(db!=null){
  db.execSQL("INSERT INTO " + TableUsuarios + 
  " (id_usuario, nombre, email) " +
  " VALUES(" + idUsuario + ", '" + nombre + "', '" + email +"' ) ");
  db.close();   
 }
}


El método creado es muy simple, por un lado, pasamos cada uno de los campos como parámetros, normalmente lo que yo hago es pasarle un objeto, en este caso sería Usuario, lo que me hace mucho más fácil hacer modificaciones de código, pero para simplificar lo dejamos así. Por otro lado, no se está tratando de ninguna forma ni nombre ni email, si intentarais insertar un nombre con una comilla la consulta fallaría, lo mejor para esto es realizar un método que haga un reemplazo para este caso.


Como veis, también he creado el objeto db de tipo SQLiteDatabase, que se corresponde con la base de datos y lo utilizaré para escribir datos, por lo tanto lo abro en modo escritura con getWritableDatabase, en caso de querer leer datos sería getReadableDatabase.
Lo siguiente es ejecutar la consulta de inserción con execSQL. La consulta no es difícil, le digo que haga una inserción (INSERT INTO) en la tabla usuarios, luego marco los campos que insertaré y por último mis valores (VALUES), los de tipo String van entrecomillados. Por último cerramos la conexión con la base de datos y listo.


Una vez listo el método de inserción veamos como utilizarlo en nuestra aplicación. Vamos al archivo de nuestra activity HolaMundoActivity.java y vamos a escribir un método que escribirá unos cuantos registros en nuestra base de datos. La forma en como llameis a este método os lo dejo a vuestra elección esta vez, podeis hacerlo mediante un botón, en el inicio de la activity o de la forma que vosotros necesitéis.


private void rellenarTablaUsuarios(){
     bbdd bd = new bbdd(this);
     bd.insertarUsuario(1, "Roberto", "roberto@example.com");
     bd.insertarUsuario(2, "Araceli", "araceli@example.com");
     bd.insertarUsuario(3, "Federico", "federico@example.com");
     bd.insertarUsuario(4, "Maria", "maria@example.com");
}


Por el momento, los datos los tenemos que seguir poniendo nosotros a mano, pronto dedicaremos un artículo al acceso a datos externos. Cada vez que llamemos al método rellenarTablaUsuarios estaremos insertando en nuestra tabla los datos que le hemos marcado.


Ahora nos quedaría ver como recuperar los datos y trabajar con ellos, pero este tema lo hablaremos la semana que viene.

Comments are closed.