Acceder al fichero de una base de datos SQLite en Android.

He recibido un comentario en uno de mis artículos preguntando como acceder al fichero de la base de datos Sqlite local que se crea desde nuestra aplicación. Obviamente no me refiero a acceder desde nuestra aplicación y trabajar con consultas, sino a acceder físicamente al fichero para copiarlo a nuestro pc y abrirlo con algún editor externo. A continuación como lo hago yo.

1.- Si trabajamos con el emulador de android o un dispositivo rooteado.

Si estamos probando nuestra aplicación con el emulador de android, podemos utilizar el explorador de archivos que proporciona el SDK de Android para acceder a todas las carpetas de nuestro dispositivo. Por ejemplo, desde Android Studio:

file_explorer_android

  1. Arrancamos el emulador y esperamos a que inicie.
  2. Lanzamos el Android Debug Monitor
  3. Seleccionamos nuestro emulador. A la derecha aparecerán nuestros archivos. Las bases de datos suelen estar en la carpeta //data/data/com.mi_Dominio.app/databases
  4. Usamos el icono de descarga para traspasar el fichero a nuestro ordenador.


2.- Si trabajamos con un dispositivo no rooteado.

En este caso, el directorio donde se guardan las bases de datos tiene permisos 700 y no se visualizará nada en el explorador de archivos. La solución más sencilla en este caso es copiar desde nuestro programa el fichero de base de datos a una ubicación a la que si podamos acceder. Con una rutina como la que sigue:

27 comentarios en “Acceder al fichero de una base de datos SQLite en Android.”

  1. si esa es la mejor solucion para obtener la base de datos de un dispositivo fisico, que bueno que compartes tus conocimientos, un saludo…

  2. Una pregunta el metodo obtenerDirectorioCopias() es para la direccion de salida verdad? podrias explicarme como funciona o si puedo poner una ruta por defecto?

    • Si claro, el metodo obtener directorio copias te devuelve la direccion de salida. No he puesto el contenido del directorio, ya que cada usuario puede querer hacer la copia en un lugar diferente, asi que no le vi mucho sentido. Puedes poner la ruta que te parezca siempre que tengas permisos para acceder a ella.

      En el siguiente articulo tienes mas o menos claro donde puedes grabar cosas y que permisos necesitas:

      http://developer.android.com/training/basics/data-storage/files.html

  3. Hola, sabrias de algun codigo en el que me pudiera mostrar la consulta de datos aleatorios? no quiero ver todos los registros, solo quiero ver uno aleatorio, los datos son extensos asi que uso una base de datos, pero o es que soy bruto o no entiendo que no logro hacer la conexion, la base de datos ya tendria precargada la informacion, por lo que no seria necesario insertar/eliminar registros, y la consulta debe ser aleatoria. Puedes ayudarme? de antemano muchas gracias

  4. Muchas gracias por el aporte, solo una cosa, a la hora de acceder al fichero de una base de datos SQLite, nos comentas 4 pasos, y en la foto aparecen muy bien señalados 3 de ellos, pero el 4, que seria usar el icono de descarga para pasar el archivo a nuestro ordenador, no lo encuentro por ningún lado, si alguien me pudiera resolver esta duda, le estaría agradecido, un saludo y gracias.

  5. Muy bien el ejemplo, pero para algunos que tengan un android No rooteado y tengan problemas para acceder a la db, aca les dejo un ligera modificacion para poder ver el archivo db.

    Deberemos desplazarnos hasta el directorio del celular: Mis Archivos/Dispositivo/Android/data/com.MyProyect/files/

    public static void BD_backup(Context context) throws IOException {
    String timeStamp = new SimpleDateFormat(«ddMMyyyy_HHmmss»).format(new Date());

    final String inFileName = context.getDatabasePath(DATABASE_NAME).getAbsolutePath();
    File dbFile = new File(inFileName);
    FileInputStream fis = null;

    fis = new FileInputStream(dbFile);
    File file = new File(context.getExternalFilesDir(null), DATABASE_NAME + «_» + timeStamp);
    Log.d(TAG, «inFileName: » + file.getAbsolutePath());

    OutputStream output = new FileOutputStream(file);

    byte[] buffer = new byte[1024];
    int length;
    while ((length = fis.read(buffer)) > 0) {
    output.write(buffer, 0, length);
    }

    output.flush();
    output.close();
    fis.close();
    }

      • Hola,

        obtenerFicheroCopias(), simplemente te devuelve una ruta a un fichero, que es el destino a donde quieres copiar tu base de datos. Como cada usuario querrá copiarlo a una ruta diferente, la función no esta en el ejemplo, pues lo que valdria para un usuario no valdria para otro.

        Por lo tanto, simplemente sustituyelo por la ruta al fichero de destino. Depende de la app que estes haciendo, tu sabrás a donde quieres copiarlo.

        Tema tag: en android, existe la costumbre de declarar en cada clase, un tag (etiqueta), para que cuando enviemos informacion de depuracion a la consola mediante la clase LOG, podamos saber de donde viene esa informacion. Por ejemplo:

        public abstract class MainActivity extends AppCompatActivity {

        protected final String TAG= getClass().getSimpleName();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContenView(....)

        Log.d(TAG,"Informacin de debug aqui...");

        }
        }

        Saludos

  6. Como podria hacer para realizar la operacion contraria, es decir para coger el archivo de la base de datos e importarla, desde esa ruta..

    • usando el mismo codgio solo intercambias las rutas

      public void RestoreDatabase(){
      try {
      File sd = Environment.getExternalStorageDirectory();

      File data = Environment.getDataDirectory();
      String packageName = «com.example.seller»;
      String sourceDBName = «Base_De_Datos.sqlite»;
      String targetDBName = «Base_De_Datos»;
      if (sd.canRead()) {
      Date now = new Date(0);
      String currentDBPath = «data/» + packageName + «/databases/» + sourceDBName;
      SimpleDateFormat dateFormat = new SimpleDateFormat(«yyyy-MM-dd-HH-mm»);
      String backupDBPath = targetDBName + «.sqlite»;

      File currentDB = new File(data, currentDBPath);
      File backupDB = new File(sd, backupDBPath);

      Toast toast = Toast.makeText(this,»backupDB=» + backupDB.getAbsolutePath(), Toast.LENGTH_SHORT);
      toast.show();
      Toast toast2 = Toast.makeText(this, «sourceDB=» + currentDB.getAbsolutePath(), Toast.LENGTH_SHORT);
      toast2.show();

      /* AL INTERCAMBIAR ESTAS 2 RUTAS hace una restauracion tiene que tener el mismo nombre el archivo a recuperar y ubicarlo en la mismo lugar donde caen los respaldos con la funcion de respaldo*/
      FileChannel src = new FileInputStream(backupDB ).getChannel();
      FileChannel dst = new FileOutputStream(currentDB).getChannel();
      dst.transferFrom(src, 0, src.size());
      src.close();
      dst.close();
      }
      } catch (Exception e) {
      Log.i(«Backup», e.toString());

      builder.setMessage(«Error al Restaurar: » + e.toString())
      .setTitle(«Atención!!»)
      .setCancelable(false)
      .setNeutralButton(«Aceptar»,
      new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int id) {
      dialog.cancel();

      }
      });
      AlertDialog alert = builder.create();
      alert.show();
      }
      }

  7. Como podria hacerle para precargar datos en una aplicacion movil, ya que cuando genero el apk desde android studio solo se copia la base, pero va en blanco, y yo quiero que lleve datos precargados para que mi app sea funcional, les agradeceria su ayuda por favor

    • Hola Luis Enrique,

      entiendo que cuando hablas de base, te refieres a la base de datos. Cuando instalas la app en un dispositivo por primera vez, efectivamente, la base de datos sqlite se crea vacía. Si quieres que tu app use una base de datos que ya tenga contenido, tienes varias opciones:

      1.- Descargar los datos de un servidor despues de la instalación.
      2.- Incluir en tu carpeta assets ficheros, en formato csv, o formato json, e importar esos datos a las correspondientes tablas.
      3.- O incluir en la carpeta assets un fichero sqlite con datos, y despues de la instalacion, copiarlo y sobreescribir la base de datos vacía. Puedes encontrar un articulo de como hacer esto en el siguiente enlace:

      http://www.hell-desk.com/copiar-bd-sqlite-al-directorio-databases-app-android/

      Un saludo

      • Gracias, ya hice el metodo del link que me has mandado, pero la base sigue igual en blanco, me interesaria saber en que parte de la actividad principal va dicho metodo, pues lo he puesto al final

        • Bueno, es dificil saber lo que esta ocurriendo. ¿Quizas estas copiando la base de datos, y despues, vuelves a crear una base de datos en blanco y la sobreescribes?

          • Volví a hacer una prueba nueva ahora solo con el código propuesto, aun sigue sin tomar la base de datos, mi pregunta es si la base se instala cuando instalo la app en el móvil o hay que pasarla manualmente

          • Hola,

            he creado un foro nuevo para tratar temas relacionados con la programación en Android. ¿Por que no creas un hilo en el foro sobre este asunto, y me pegas tu codigo fuente, asi puede echarle un vistazo y ver por que no funciona?

            Un saludo

  8. como seria la ruta para copiar al pc? obtenerDirectorioCopias(), eso no me quedo claro, podrias poner un ejemplo?

Los comentarios están cerrados.