Spanish (B4A) ¿Qué carpeta se recomienda usar para almacenar archivos internos de una App?

Seneca

Active Member
Licensed User
Hola.

Aunque imagino que depende de las preferencias de cada cual, me gustaría me orientasen sobre qué carpetas usar para almacenar archivos internos de la App (BD e imágenes de iconos por ejemplo).

Quiero que la App muestre en su pantalla inicial una serie de iconos (botones). El título y nombre del archivo imagen de cada icono ha de consultarlos la App de una base de datos, de manera que esa pantalla inicial puede ser modificada tan solo actualizando la BD, que se aloja en un servidor.

Los pasos que se me ocurre he de seguir son los siguientes:
  • En la primera ejecución, la App descarga la BD del servidor al dispositivo y tras consultarla descarga las imágenes de todos los iconos también del servidor al dispositivo.
  • En las siguientes ejecuciones, la App consulta si la BD del servidor ha sufrido alguna actualización:
    • Si hubo actualización, descarga la nueva versión de la BD del servidor al dispositivo y tras consultarla comprueba si también ha de descargar alguna nueva imagen.
    • Si no hubo actualización, continúa la ejecución de la App.

Respecto a dónde alojar tanto la BD como las imágenes se me plantean varias dudas:
  • ¿Lo ideal es colocarlos preferentemente en la SD (si está disponible), de manera que no use almacenamiento interno del dispositivo que en muchos casos es bastante limitado?
  • Si se alojan en la SD y en un momento determinado el usuario la retira, habría que descargar nuevamente BD e imágenes hasta la memoria interna del dispositivo ¿no?
  • ¿Se puede hacer que tanto BD como imágenes estén más o menos ocultos a un posible usuario que indague por las carpetas usando un explorador de archivos (App), evitando así posibles borrados accidentales? En caso de no ser posible, supongo que lo mejor sería proteger con contraseña la BD.

Reconozco que estoy bastante perdido :rolleyes:

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Buenos dias y Feliz Año nuevo Séneca:

¿Lo ideal es colocarlos preferentemente en la SD (si está disponible), de manera que no use almacenamiento interno del dispositivo que en muchos casos es bastante limitado?
Si se alojan en la SD y en un momento determinado el usuario la retira, habría que descargar nuevamente BD e imágenes hasta la memoria interna del dispositivo ¿no?
Desde Android 4 o así (no recuerdo la versión exacta), ya no se puede grabar en la SD Externa (extSDCard ), según Google por "politica de seguridad " :p , a menos que seas root, pero no te lo aconsejo ya que la mayoria de gente que dispone de dispositivo movil no es root. Creo recordar que desde Android 6, se puede hacer "un invento" montando/desmontando la extSDCard o el USB, en el foro ingles hay algun ejemplo.

¿Se puede hacer que tanto BD como imágenes estén más o menos ocultos a un posible usuario que indague por las carpetas usando un explorador de archivos (App), evitando así posibles borrados accidentales? En caso de no ser posible, supongo que lo mejor sería proteger con contraseña la BD.
Uno de los sitios "clasicos" es la carpeta de la propia aplicación (File.DirDefaultExternal) , esta carpeta normalmente está dentro de Android con el nombre del paquete de la aplicación, suele estar en: /storage/emulated/0/Android/data/nombre del paquete de la APP/files.
Tambien puedes crear la carpeta (o carpetas en serie) que quieras desde la raiz con File.DirRootExternal

Si quieres mas información mirate un tutorial que tenemos en nuestro foro sobre almacenamiento en Android:
https://www.b4x.com/android/forum/threads/b4a-tutorial-almacenamiento-en-android.13039/

Saludos
 

Seneca

Active Member
Licensed User
Hola Jesús.

Desde Android 4 o así (no recuerdo la versión exacta), ya no se puede grabar en la SD Externa (extSDCard ), según Google por "politica de seguridad " :p , a menos que seas root, pero no te lo aconsejo ya que la mayoria de gente que dispone de dispositivo movil no es root. Creo recordar que desde Android 6, se puede hacer "un invento" montando/desmontando la extSDCard o el USB, en el foro ingles hay algun ejemplo.

Siendo esto así, prefiero entonces no grabar en la SD y seguir las recomendaciones de Google.

Uno de los sitios "clasicos" es la carpeta de la propia aplicación (File.DirDefaultExternal) , esta carpeta normalmente está dentro de Android con el nombre del paquete de la aplicación, suele estar en: /storage/emulated/0/Android/data/nombre del paquete de la APP/files.
Tambien puedes crear la carpeta (o carpetas en serie) que quieras desde la raiz con File.DirRootExternal

Si quieres mas información mirate un tutorial que tenemos en nuestro foro sobre almacenamiento en Android:
https://www.b4x.com/android/forum/threads/b4a-tutorial-almacenamiento-en-android.13039/

Antes de hacer mi consulta estuve buscando respuesta en el foro y lei el tutorial que me indicas. En el mismo indica:

File.DirRootExternal
La carpeta raiz de la tarjeta SD

File.DirDefaultExternal
Es la carpeta por defecto de la aplicación en la tarjeta SD.
Está localizada en: <tarjeta_SD>/Android/data/<paquete>/files/
Será creada automáticamente si es necesaria.

Con esto entendí que con tarjeta SD se refería a la tarjeta externa micoSD, pero eso no me cuadra. He supuesto entonces que tarjetaSD está en la memoria del dispositivo y cuando tú me indicabas extSDCard esta sí es realmente la microSD

Ayer estuve curioseando en mi móvil a ver qué carpetas creaban las App's que tengo instaladas y encontré justo las rutas que me indicas dentro de la memoria interna (/storage/emulated/0/Android/data/nombre del paquete de la APP/files). En algunas de estas App's encontré las carpetas con los archivos de imagen de la propia App, con nombres aleatorios y sin extensión. También había otra serie de archivos que no he sabido identificar y supongo que alguno de ellos podría ser alguna BD. Y esto es justo lo que pretendo, que la BD esté lo más reservada posible.

Con lo que me has indicado ya tengo para hacer pruebas y ponerme al día.

Gracias Jesús por tu ayuda y Feliz y Saludable 2017
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Séneca:

Con esto entendí que con tarjeta SD se refería a la tarjeta externa micoSD, pero eso no me cuadra. He supuesto entonces que tarjetaSD está en la memoria del dispositivo y cuando tú me indicabas extSDCard esta sí es realmente la microSD

Esto es algo que proviene de lejos, incluso Erel cuando explica las diferentes carpetas, cuando hace referencia a File.DirRootExternal lo designa como storage card root folder, y File.DirDefaultExternal la define como The default folder for your application in the SD card y la ubica en <storage card>/Android/data/<package>/files/ , y con esto no queria decir que estuviera en la SD externa, pero estamos hablando del 2010, cuando los dispositivos móviles todos venian con tarjeta externa por que la memoria interna era mínima (e incluso se podia instalar la aplicación en la extSDCard), y esto quedó asi, y en vez de hablar de la memoria del dispositivo que seria mas correcto, se decia la SD Card, por eso te maticé lo de extSDCard, por que es muy facil confundir los términos.

Lo mejor para estos casos cuando te surge la duda de donde esta una carpeta es verlo con un log:
B4X:
  log("DirDefaultExternal " & File.DirDefaultExternal)
  log("DirRootExternal " & File.DirRootExternal)

Saludos
 

Seneca

Active Member
Licensed User
Hola.

Con lo práctico que sería llamarle a cada almacenamiento por su nombre... :)

En el libro B4A:Rapid Android App Development using BASIC hace justo esta aclaración que tú indicas.

“External” Storage
The next two locations are public storage on the device’s main memory. The user and other apps can see and modify this data.
Note: Use of the word “External” can be confusing, since this directory is located on the device’s internal storage, not the external SD card!
Access to the external storage card has changed as Android has developed.

Saludos.
 
Top