Como copiar una bd SQLite al directorio databases de una app Android

Un lector me ha preguntado en el artículo que escribí hace tiempo, Como acceder al fichero de una bd Sqlite en Android, como se puede hacer la operación contraria, es decir, copiar el fichero de base de datos al directorio databases desde otra localización.

Copiar un fichero de base de datos al directorio de bases de datos de una app Android, puede ser una técnica muy útil en algunos escenarios. Por ejemplo, la aplicación de un cliente, durante la primera ejecución, descargaba de internet una gran cantidad de información, la procesaba, y con ella creaba una base de datos Sqlite. Este proceso duraba mucho tiempo, entre 20 o 30 segundos dependiendo del hardware del dispositivo Android, y de la velocidad de conexión a internet. Y este proceso se realizaba durante la primera ejecución de la app, con lo cual, la tasa de abandonos de usuarios que acababan de instalar la app, y no veían razonable esperar 30 segundos a que la app se inicializará, era muy grande.

La solución fue incluir el fichero de base de datos sqlite ya creado, en la carpeta assets de nuestro proyecto, y durante la primera ejecución, copiarlo al directorio databases. Pasamos de una primera ejecución de más de 20 segundos, a que el lanzamiento de la app fuera casi instantáneo, a lo sumo tarda dos o tres segundos. La receta, es la siguiente:

 

Creamos un proyecto de Android Studio mínimo como ejemplo, y en el directorio “assets” del proyecto, incluimos el fichero de base de datos sqlite que queremos desplegar. En nuestro caso el fichero se llama “cache“, y es una base de datos de unos 5Mb, que apenas engorda el tamaño del apk, pero que si la tuviésemos que descargar de internet y crear al vuelo, ralentizaría la primera ejecución de nuesta app más allá de lo razonable.

Tras copiar el fichero sqlite al directorio assets, tendremos algo similar a lo siguiente:

Fichero de sqlite en le directorio assets
Fichero de sqlite en le directorio assets

El fichero puede provenir de otro directorio, por ejemplo, del directorio de descargas de vuestro teléfono, o cualquier otro directorio. En ese caso tendrías que idear un mecanismo para que el usuario seleccione la ubicación del fichero del árbol de directorios. Para mantener el ejemplo sencillo, nuestra base de datos está en el directorio “assets”, y el objetivo es copiarla al directorio “/data/data/com.hell_desk.deploydatabase/databases”. Obviamente, en el caso de una aplicación con un nombre de paquete diferente, la ruta será distinta.

En nuestra actividad principal, añadimos un pequeño método que hará la copia:

[crayon-5ba6277ec0591845968919/]

Bien, como veis, el snippet es muy sencillito. Lo primero que hace es construir la ruta al directorio donde se copiará la base de datos. A continuación crea un InputStream al fichero sqlite que tenemos en assets, y lo copia a la carpeta de destino.

Ya podéis usar ese fichero de base de datos en vuestra aplicación.