entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Alternativa a pantalla Splash al cargar Base de datos

Hola.

Me gustaría saber un poco la opinión de la gente. En numerosos post (a modo de eejmplo; http://www.limecreativelabs.com/splash-screens-en-android/) leo que las pantallas Splash no son necesarias e incluso que son perjudiciales.

Yo prefiero que mi app no tenga pantalla Splash. Con lo cual me surge una duda. Hasta ahora usaba la pantalla Splash para cargar una base de datos. Si la base de datos existe la pantlla splash desaparece de inmediato pero se sigue mostrando como un "fogonazo".

Para no tener que usar la pantalla Splash que me aconsejáis para cargar la base de datos. Esta lógicamente solo se carga la primera vez que se inicia la app.

Saludos!

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Egoitz,

totalmente de acuerdo con que las pantallas splash (en aplicaciones móviles, web y todo lugar en dónde aparecen) son perjudiciales y en el 99.9% de los casos, innecesarias.

Para el caso de tu aplicación, podrías mostrar lo mismoq ue muestra siempre cuando abre, aunque los datos estén vacíos la primera vez, que es cuando carga los datos, y para ese caso, poner una simple barra de progreso indicando que se están descargando los datos necesarios.

Esta barra de progreso puede ser real, indicando un porcentaje, o simulada, mostrando actividad con su animación solamente para volver a empezar cuando termine.

Esto es honesto con el usuario, cosa que siempre es apreciable, y aparecerá únicamente cuando haya que descargar datos, con lo que se evitará el "fogonazo" que mencionás.

0voto

egoitz_gonzalez comentado

Hola.

Lo que estoy intentado hacer es volcar los datos de un fichero datos.db al dispositivo movil. Esto lo estoy intentando realizar asincronamente. El error que me lanza es curioso.

Explico:

Si no vuelco los datos asincronamente, la Base de datos se crea correctamente, pero en el log cat recibo el siguiente error.

sqlite3_open_v2("data/data/com.mipaquete.instalacionesdep/databases/instalacionesdep.db", &handle, 1, NULL) failed

Failed to open the database. closing it.
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
............

Pero si vuelco los datos asincronamente, entonces recibo ese error mas uno mas (El siguiente) y se cuelga la app.

FATAL EXCEPTION: AsyncTask #1

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
12-at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)

Alguna idea?

Gracias y saludos!

0voto

Leonardo-Tadei comentado

Hola Egoitz,

pero eso es obvio! El fallo se produce porque estás queriendo abrir un archivo que todavía no existe.

Poné la llamada a

sqlite3_open_v2()

en un IF que pregunte primero si el archivo existe, y si no existe que no haga nada (o muestre el cartel de "descargando").

El segundo error es menos evidente y está relacionado con el orden de ejecución. Al querer abrir la DB inexistente, obtenés un error de que no existe pero la misma es creada. Luego, la tarea asincrónica quiere escribir ese archivo, pero ya se encuentra en uso por la llamada a sqlite3_open_v2() .

La solución es la misma que la anterior: no abrir el archivo si este no existe, con lo que el recurso no quedará bloqueado. Luego de terminada la sincronización, es decir, al finalizar exitosamente la tarea asincrónica, deberás ahí sí abrir el archivo para poder acceder a los datos.

Saludos!

PD: este tema ya no es el de la pregunta original, así que de seguir es mejor hacerlo en una pregunta aparte.

0voto

egoitz_gonzalez comentado

OK. Abro otro hilo porque no consigo dar con la solución. El primer error lo controlo mediante un IF y aun así sigue saltando el error. Explico mejor en un hilo nuevo y doy este por finalizado.

Gracias.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta