Carlos Robles frikiblog

SQLite en Android, distribuir aplicacion con base de datos por defecto

| 0 comments

Una de las formas mas sencillas y eficaces de guardar información persistente en Android es en una base de datos SQLite.
Como veremos en miles blogs, sencillamente se trata de crear una base de datos, y luego rellenarla y leerla cuando nos convenga. La clase SQLOpenHelper ayuda con toda la tarea. En internet se encuentran mil manuales.
Una duda que puede surgir inicialmente, es qué hacer cuando queremos distribuir una base de datos con datos. Por ejemplo, en el juego que estoy desarrollando, guardo una base de datos con los niveles, el estado (resuelto, bloqueado, activo), el tiempo empleado en resolverlo,  y la cantidad de hitos conseguidos. Crear la base de datos sobre la marcha es muy sencilla, porque siempre se crea vacia, y es inmediato  con las propias funciones de SQLOpenhelper. Pero qué pasa cuando queremos que la base de datos vaya con informacion incluida? por ejemplo en el caso de que nuestro programa muestre informacion offline sobre el tema que sea, y esa informacion está en BD. Pues se pueden hacer 3 cosas:

  1. Podemos tratar de crear todas las queries a mano, y meterlas en el onCreate, es decir, ademas de la estructura, que haga inserts de los datos.
  2. Crear la base de datos programaticamente, por ejemplo con una aplicacion que creamos para recoger datos de donde sea y meterlos en la base de datos SQLite, despues exportala a código (un dump de toda la vida), y copiar ese código en la funcion onCreate. Esto es una version de lo anterior.
  3. La siguiente, y un poco más limpia es: crear la base de datos que te dé la gana, y buscar el archivo que la alberga, porque SQLite, evidentemente no hace magia, y guarda un archivo para  las bases de datos.

La Opcion 3, es la menos inmediata. Y es la que es mas digna de explicar:

Buscamos ese archivo, normalmente estará en /data/data/NOMBRE.DEL.PAQUETE/databases/
Recuerda que tanto para simuladores como para dispositivos reales, podemos utiliar la perspectiva DDMS para explorar el sistema de archivos.

Cuando lo encontremos… lo copiamos y lo ponemos en la carpeta de Assets de nuestro proyecto, donde nos guste más.

Ah0ra en el programa hacemos una funcion que se encargue de mover el archivo a la posición adecuada. Con esto conseguimos que la base de datos se incluya en el apk, y asi pueda ser distribuida, y la primera vez que se ejecute en u movil, se copiará donde corresponda para poder usar SQLite de la forma habitual.

La función podria ser algo asi:

public void onCreate() {

InputStream origen = null;

try {

origen = getAssets().open(NOMBRE_DE_LA_BASE_DE_DATOS);

OutputStream destino = new FileOutputStream(RUTA_A_LA_BASE_DE_DATOS_SQLITE +  NOMBRE_DE_LA_BASE_DE_DATOS )

byte[] buffer = new byte[1024];

int length;

while ((length = origen.read(buffer)) > 0) {

destino.write(buffer, 0, length);

}

dbOut.flush();

dbOut.close();

assetsDB.close();

Log.i(TAG, "New database created...");

} catch (IOException e) {

Log.e(TAG, "Could not create new database...");

e.printStackTrace();

}

}

Esto no tiene ninguna magia, mueve el archivo de forma binaria, como hariamos para copiar cualquier otro archivo con cualquier contenido.

Para probarlo, puedes ir a la carpeta ‘Android SDK – Tools’ y utilizar la herramienta adb, asi:
run:

Abrir el shell del emulador actual:

adb -e shell

ir a la carpeta en cuestion donde deberia estar y hacer un ls, para ver si al menos estar, está.

#cd  /data/data/NOMBRE.DEL.PAQUETE/databases/

#ls

Y ahora puedes hacer alguna consulta para ver que el archivo está integro.

#sqlite3 nombre_de_la_bd
#select * from nombre_de_la_tabla;

y eso es to, eso es to, eso es todo amigos.

Facebook Twitter Linkedin Plusone Digg Delicious Reddit Email

Leave a Reply

Required fields are marked *.