Si su aplicación requiere una base de datos y viene con datos integrados, ¿cuál es la mejor manera de enviar esa aplicación? Debería:
Precrear la base de datos SQLite e incluirla en el
.apk
?¿Incluya los comandos SQL con la aplicación y haga que cree la base de datos e inserte los datos en el primer uso?
Los inconvenientes que veo son:
Los posibles desajustes de la versión de SQLite pueden causar problemas y actualmente no sé a dónde debe ir la base de datos y cómo acceder a ella.
Puede tomar mucho tiempo crear y llenar la base de datos en el dispositivo.
¿Alguna sugerencia? Se agradecerán los indicadores de la documentación sobre cualquier problema.
android
android-sqlite
android-database
Heikki Toivonen
fuente
fuente
Respuestas:
Hay dos opciones para crear y actualizar bases de datos.
Una es crear una base de datos externamente, luego colocarla en la carpeta de activos del proyecto y luego copiar toda la base de datos desde allí. Esto es mucho más rápido si la base de datos tiene muchas tablas y otros componentes. Las actualizaciones se activan cambiando el número de versión de la base de datos en el archivo res / values / strings.xml. Las actualizaciones se realizarían creando una nueva base de datos externamente, reemplazando la base de datos anterior en la carpeta de activos con la nueva base de datos, guardando la base de datos anterior en el almacenamiento interno con otro nombre, copiando la nueva base de datos de la carpeta de activos en el almacenamiento interno, transfiriendo todo de los datos de la base de datos anterior (que se renombró anteriormente) a la nueva base de datos y finalmente se elimina la base de datos anterior. Puede crear una base de datos originalmente utilizando elComplemento SQLite Manager FireFox para ejecutar sus declaraciones SQL de creación.
La otra opción es crear una base de datos internamente a partir de un archivo sql. Esto no es tan rápido, pero el retraso probablemente pasará desapercibido para los usuarios si la base de datos tiene solo unas pocas tablas. Las actualizaciones se activan cambiando el número de versión de la base de datos en el archivo res / values / strings.xml. Las actualizaciones se realizarían procesando un archivo sql de actualización. Los datos en la base de datos permanecerán sin cambios, excepto cuando se elimine su contenedor, por ejemplo, soltar una tabla.
El siguiente ejemplo muestra cómo usar cualquiera de los métodos.
Aquí hay un archivo de muestra create_database.sql. Debe colocarse en la carpeta de activos del proyecto para el método interno o copiarse en el "Ejecutar SQL 'de SQLite Manager para crear la base de datos para el método externo. (NOTA: Observe el comentario sobre la tabla requerida por Android).
Aquí hay un archivo de ejemplo update_database.sql. Debe colocarse en la carpeta de activos del proyecto para el método interno o copiarse en el "Ejecutar SQL" de SQLite Manager para crear la base de datos para el método externo. (NOTA: Tenga en cuenta que los tres tipos de comentarios SQL serán ignorados por el analizador sql que se incluye en este ejemplo).
Aquí hay una entrada para agregar al archivo /res/values/strings.xml para el número de versión de la base de datos.
Aquí hay una actividad que accede a la base de datos y luego la usa. ( Nota: es posible que desee ejecutar el código de la base de datos en un hilo separado si usa muchos recursos ) .
Aquí está la clase auxiliar de la base de datos donde la base de datos se crea o actualiza si es necesario. (NOTA: Android requiere que cree una clase que amplíe SQLiteOpenHelper para poder trabajar con una base de datos Sqlite).
Aquí está la clase FileHelper que contiene métodos para copiar archivos de flujo de bytes y analizar archivos sql.
fuente
La
SQLiteAssetHelper
biblioteca hace que esta tarea sea realmente simple.Es fácil agregarlo como una dependencia de gradle (pero también está disponible un Jar para Ant / Eclipse), y junto con la documentación se puede encontrar en:
https://github.com/jgilfelt/android-sqlite-asset-helper
Nota: Este proyecto ya no se mantiene como se indica en el enlace de Github anterior.
Como se explica en la documentación:
Agregue la dependencia al archivo de compilación gradle de su módulo:
Copie la base de datos en el directorio de activos, en un subdirectorio llamado
assets/databases
. Por ejemplo:assets/databases/my_database.db
(Opcionalmente, puede comprimir la base de datos en un archivo zip como
assets/databases/my_database.zip
. Esto no es necesario, ya que el APK ya está comprimido como un todo).Crea una clase, por ejemplo:
fuente
Mi solución no utiliza ninguna biblioteca de terceros ni le obliga a llamar a métodos personalizados en la
SQLiteOpenHelper
subclase para inicializar la base de datos en la creación. También se encarga de las actualizaciones de la base de datos. Todo lo que hay que hacer es subclasificarSQLiteOpenHelper
.Requisito previo:
android_metadata
con un atributo quelocale
tenga el valoren_US
además de las tablas exclusivas de su aplicación.Subclases
SQLiteOpenHelper
:SQLiteOpenHelper
.private
método dentro de laSQLiteOpenHelper
subclase. Este método contiene la lógica para copiar el contenido de la base de datos del archivo de la base de datos en la carpeta 'activos' a la base de datos creada en el contexto del paquete de la aplicación.onCreate
,onUpgrade
yonOpen
métodos deSQLiteOpenHelper
.Basta de charla. Aquí va la
SQLiteOpenHelper
subclase:Finalmente, para obtener una conexión de base de datos, solo llame
getReadableDatabase()
ogetWritableDatabase()
en laSQLiteOpenHelper
subclase y se encargará de crear una base de datos, copiando el contenido de la base de datos del archivo especificado en la carpeta 'assets', si la base de datos no existe.En resumen, puede usar la
SQLiteOpenHelper
subclase para acceder a la base de datos incluida en la carpeta de activos tal como lo usaría para una base de datos que se inicializa mediante consultas SQL en elonCreate()
método.fuente
Envío de la aplicación con un archivo de base de datos, en Android Studio 3.0
Enviar la aplicación con un archivo de base de datos es una buena idea para mí. La ventaja es que no necesita hacer una inicialización compleja, que a veces cuesta mucho tiempo, si su conjunto de datos es enorme.
Paso 1: preparar el archivo de base de datos
Tenga listo su archivo de base de datos. Puede ser un archivo .db o un archivo .sqlite. Si usa un archivo .sqlite, todo lo que necesita hacer es cambiar los nombres de las extensiones de archivo. Los pasos son los mismos.
En este ejemplo, preparé un archivo llamado testDB.db. Tiene una tabla y algunos datos de muestra como esta
Paso 2: importa el archivo a tu proyecto
Cree la carpeta de activos si no ha tenido una. Luego copie y pegue el archivo de la base de datos en esta carpeta
Paso 3: copie el archivo en la carpeta de datos de la aplicación
Debe copiar el archivo de la base de datos a la carpeta de datos de la aplicación para poder interactuar más con ella. Esta es una acción única (inicialización) para copiar el archivo de la base de datos. Si llama a este código varias veces, el archivo de la base de datos en la carpeta de datos será sobrescrito por el de la carpeta de activos. Este proceso de sobrescritura es útil cuando desea actualizar la base de datos en el futuro durante la actualización de la aplicación.
Tenga en cuenta que durante la actualización de la aplicación, este archivo de base de datos no se cambiará en la carpeta de datos de la aplicación. Solo la desinstalación lo eliminará.
El archivo de la base de datos debe copiarse en la
/databases
carpeta. Abra el Explorador de archivos del dispositivo. Ingresedata/data/<YourAppName>/
ubicación. Esta es la carpeta de datos predeterminada de la aplicación mencionada anteriormente. Y de manera predeterminada, el archivo de la base de datos se colocará en otra carpeta llamada bases de datos en este directorioAhora, el proceso de copia del archivo es muy parecido al que está haciendo Java. Use el siguiente código para copiar y pegar. Este es el código de iniciación. También se puede usar para actualizar (sobrescribiendo) el archivo de la base de datos en el futuro.
Luego actualice la carpeta para verificar el proceso de copia
Paso 4: Crear asistente abierto de base de datos
Crea una subclase para
SQLiteOpenHelper
, con connect, close, path, etc. Lo llaméDatabaseOpenHelper
Paso 5: crea una clase de nivel superior para interactuar con la base de datos
Esta será la clase que leerá y escribirá su archivo de base de datos. También hay una consulta de muestra para imprimir el valor en la base de datos.
Paso 6: prueba de funcionamiento
Pruebe el código ejecutando las siguientes líneas de códigos.
¡Presiona el botón de correr y anima!
fuente
En noviembre de 2017, Google lanzó la Biblioteca de persistencia de habitaciones .
De la documentación:
La base de datos de la sala tiene una devolución de llamada cuando la base de datos se crea o abre por primera vez. Puede usar la devolución de llamada de creación para completar su base de datos.
Código de esta publicación de blog .
fuente
Por lo que he visto, deberías enviar una base de datos que ya tenga la configuración de tablas y los datos. Sin embargo, si lo desea (y dependiendo del tipo de aplicación que tenga) puede permitir la "opción de actualización de la base de datos". Luego, lo que debe hacer es descargar la última versión de sqlite, obtener las últimas declaraciones Insertar / Crear de un archivo de texto alojado en línea, ejecutar las declaraciones y hacer una transferencia de datos desde el antiguo db al nuevo.
fuente
¡¡Finalmente lo hice!! He usado este enlace de ayuda Usando su propia base de datos SQLite en aplicaciones de Android , pero tuve que cambiarlo un poco.
Si tiene muchos paquetes, debe poner el nombre del paquete maestro aquí:
private static String DB_PATH = "data/data/masterPakageName/databases";
¡Cambié el método que copia la base de datos de la carpeta local a la carpeta del emulador! Tuvo algún problema cuando esa carpeta no existía. Entonces, antes que nada, debe verificar la ruta y, si no está allí, debe crear la carpeta.
En el código anterior, el
copyDatabase
método nunca se llamaba cuando la base de datos no existía y elcheckDataBase
método causaba una excepción. Así que cambié un poco el código.Si su base de datos no tiene una extensión de archivo, no use el nombre del archivo con una.
funciona bien para mí, espero que sea útil para ti también
fuente
Actualmente no hay forma de crear una base de datos SQLite para enviar con su apk. Lo mejor que puede hacer es guardar el SQL apropiado como un recurso y ejecutarlo desde su aplicación. Sí, esto conduce a la duplicación de datos (la misma información existe como un recurso y como una base de datos) pero no hay otra manera en este momento. El único factor atenuante es que el archivo apk está comprimido. Mi experiencia es de 908 KB a menos de 268 KB.
El siguiente hilo tiene la mejor discusión / solución que he encontrado con un buen código de muestra.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
Almacené mi declaración CREATE como un recurso de cadena para leer con Context.getString () y la ejecuté con SQLiteDatabse.execSQL ().
Almacené los datos para mis inserciones en res / raw / inserts.sql (creé el archivo sql, más de 7000 líneas). Utilizando la técnica del enlace anterior, ingresé un bucle, leí el archivo línea por línea y concatene los datos en "INSERT INTO tBL VALUE" e hice otro SQLiteDatabase.execSQL (). No tiene sentido guardar 7000 "INSERTAR EN EL VALOR tbl" cuando simplemente se pueden concatenar.
Se tarda unos veinte segundos en el emulador, no sé cuánto tiempo llevaría en un teléfono real, pero solo ocurre una vez, cuando el usuario inicia la aplicación por primera vez.
fuente
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 línea de inserción debe tener 100 VALORES). Será mucho más eficiente y reducirá el tiempo de inicio de 20 segundos a 2 o 3 segundos.El envío de la base de datos dentro del apk y luego copiarlo
/data/data/...
duplicará el tamaño de la base de datos (1 en apk, 1 indata/data/...
) y aumentará el tamaño del apk (por supuesto). Entonces su base de datos no debería ser demasiado grande.fuente
Android ya ofrece un enfoque de gestión de bases de datos basado en versiones. Este enfoque se ha aprovechado en el marco BARACUS para aplicaciones de Android.
Le permite administrar la base de datos a lo largo del ciclo de vida completo de la versión de una aplicación, pudiendo actualizar la base de datos sqlite de cualquier versión anterior a la actual.
Además, le permite ejecutar copias de seguridad en caliente y recuperación en caliente de SQLite.
No estoy 100% seguro, pero una recuperación en caliente para un determinado dispositivo puede permitirle enviar una base de datos preparada en su aplicación. Pero no estoy seguro sobre el formato binario de la base de datos que podría ser específico para ciertos dispositivos, proveedores o generaciones de dispositivos.
Como el material es Apache License 2, siéntase libre de reutilizar cualquier parte del código, que se puede encontrar en github
EDITAR:
Si solo desea enviar datos, puede considerar crear instancias y persistir POJO en el inicio de las aplicaciones. BARACUS obtuvo un soporte integrado para esto (Almacén de valores de clave incorporado para información de configuración, por ejemplo, "APP_FIRST_RUN" más un gancho de arranque después del contexto para ejecutar operaciones posteriores al lanzamiento en el contexto). Esto le permite tener datos acoplados estrechamente enviados con su aplicación; en la mayoría de los casos esto se ajustaba a mis casos de uso.
fuente
Si los datos requeridos no son demasiado grandes (los límites que no sé, dependerían de muchas cosas), también puede descargar los datos (en XML, JSON, lo que sea) de un sitio web / aplicación web. Después de recibir, ejecute las instrucciones SQL utilizando los datos recibidos creando sus tablas e insertando los datos.
Si su aplicación móvil contiene muchos datos, podría ser más fácil actualizarlos en las aplicaciones instaladas con datos o cambios más precisos.
fuente
Modifiqué la clase y las respuestas a la pregunta y escribí una clase que permite actualizar la base de datos a través de DB_VERSION.
Usando una clase.
En la clase de actividad, declare variables.
En el método onCreate, escriba el siguiente código.
Si agrega un archivo de base de datos a la carpeta res / raw, use la siguiente modificación de la clase.
http://blog.harrix.org/article/6784
fuente
Escribí una biblioteca para simplificar este proceso.
Creará una base de datos a partir del
assets/databases/myDb.db
archivo. Además obtendrá todas esas funcionalidades:Clonarlo desde github .
fuente
Estoy usando ORMLite y el siguiente código funcionó para mí
Tenga en cuenta que el código extrae el archivo de la base de datos de un archivo zip en los activos
fuente