Ubicación de la base de datos sqlite en el dispositivo

100

He creado una base de datos sqlite mediante programación con la forma predeterminada de ampliar SQLiteOpenHelpery anular onCreate(). De esta manera, la base de datos se crea sobre la marcha cuando es necesario.

Me gustaría verificar el contenido del archivo db en mi máquina OS X con un navegador sqlite. Sé el nombre del archivo db, pero no puedo encontrarlo en el dispositivo. Me conecté al dispositivo a través de USB y busqué con el buscador y la terminal, pero no puedo encontrar el archivo db.

¿Cuál es la ubicación predeterminada para una base de datos sqlite en un dispositivo Android?

Pompair
fuente

Respuestas:

96

Puede encontrar su base de datos creada, llamada <your-database-name>

en

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>

Sáquelo usando el Explorador de archivos y cámbiele el nombre para que tenga la extensión .db3 para usarlo en SQLiteExplorer

Utilice el Explorador de archivos de DDMS para navegar al directorio del emulador.

Shardul
fuente
1
Cuando intento eso en un emulador, puedo cd a / data. Pero cuando lo intento con mi Galaxy Vibrant conectado, no puedo cd a / data. ¿El servidor adb se ejecuta con un uso diferente en esos dos casos?
Robᵩ
42
No tiene acceso a la carpeta / data en un teléfono real. Está modelado 700. Necesita privilegios de root para verlo.
Falmarri
15
Por si acaso, si desea obtener la ruta de la aplicación , es context.getDatabasePath ("<your-database-name>"). Lo que de hecho devuelve el camino anterior. Puede acceder a esta ruta para lectura y escritura, pero solo desde la aplicación que creó la base de datos.
Yaroslav Mytkalyk
Ruta predeterminada donde Android guarda bases de datos no se puede acceder en dispositivos no rooteados. Entonces, la forma más fácil de acceder al archivo de la base de datos (solo para entornos de depuración) es modificar el constructor de la clase. Algunas respuestas después de esta (exactamente aquí: stackoverflow.com/a/21832714/2982814 ), encontrará cómo manejé esto.
RandomUser
45

Por esto lo que hice fue

File f=new File("/data/data/your.app.package/databases/your_db.db3");
FileInputStream fis=null;
FileOutputStream fos=null;

try
{
  fis=new FileInputStream(f);
  fos=new FileOutputStream("/mnt/sdcard/db_dump.db");
  while(true)
  {
    int i=fis.read();
    if(i!=-1)
    {fos.write(i);}
    else
    {break;}
  }
  fos.flush();
  Toast.makeText(this, "DB dump OK", Toast.LENGTH_LONG).show();
}
catch(Exception e)
{
  e.printStackTrace();
  Toast.makeText(this, "DB dump ERROR", Toast.LENGTH_LONG).show();
}
finally
{
  try
  {
    fos.close();
    fis.close();
  }
  catch(IOException ioe)
  {}
}

Y para hacer esto, su aplicación debe tener permiso para acceder a la tarjeta SD, agregue la siguiente configuración a su manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

No es una forma brillante, pero funciona.

RRTW
fuente
Agradable. Yo estaba buscando esto. También se podría optar por cargar la base de datos completa en un servidor para su análisis de esta manera.
Jeroen
3
si no funciona ... use el nombre de la base de datos "/data/data/your.app.package/databases/your_db" Simplemente elimine la extensión ".db3"
Nigel Crasto
1
Esta solución funciona bien. Pero, puede usar getDatabasePath (your_db_name) para obtener el objeto File y usar getAbsolutePath () para obtener una ruta precisa en lugar de construirla. El método getDatabasePath se define en ContextWrapper.
Roy
Los nombres de archivo y ruta distinguen entre mayúsculas y minúsculas en Android.
AndroidDev
29

El contexto contiene muchas funciones de ruta: Context.getXXXPath ()
Una de ellas es android.content.Context.getDatabasePath (String dbname) que devuelve la ruta absoluta de una base de datos llamada dbname.

Context ctx = this; // for Activity, or Service. Otherwise simply get the context.
String dbname = "mydb.db";
Path dbpath = ctx.getDatabasePath(dbname);

La ruta devuelta, en este caso, sería algo como:

/data/data/com.me.myapp/databases/mydb.db

Tenga en cuenta que esta ruta se genera automáticamente si usa SQLiteOpenHelper para abrir la base de datos.

Shoham
fuente
25

Si estás hablando de un dispositivo real /data/data/<application-package-name>es inaccesible. Debe tener derechos de root ...

Estrella roja de Barmaley
fuente
Eso no es exactamente cierto. No es navegable , pero la accesibilidad de los archivos internos depende de sus bits de permisos individuales.
Chris Stratton
Mi teléfono está rooteado. ¿Cómo puedo "navegar" por la carpeta de datos?
Sreecharan Desabattula
@SreecharanDesabattula, debe ir a adb shell y cambiar a superusuario usando el comando "su" para navegar por el directorio.
Gautham C.
/ system / bin / sh: su: no encontrado
Sunnyday
@Sunnyday Trysudo su
Mohammedsalim Shivani
19

Esta es una vieja pregunta, pero responder puede ayudar a otros.

Ruta predeterminada donde Android guarda bases de datos no se puede acceder en dispositivos no rooteados. Entonces, la forma más fácil de acceder al archivo de la base de datos (solo para entornos de depuración) es modificar el constructor de la clase:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "/mnt/sdcard/database_name.db", null, 0);
    }
}

Recuerde cambiar para entornos de producción con estas líneas:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}
Usuario aleatorio
fuente
Intenté esto y Failed to open database '/mnt/sdcard/itens'.Logcat
devolví
1
Lo siento mucho. Esta respuesta tiene cuatro años. Y el OP es más antiguo que eso (2010). En este momento, Android es significativamente diferente de 2010. Por lo tanto, la ubicación de la base de datos puede estar en otra ruta. Siento no poder ser de más ayuda para ti.
RandomUser
Posiblemente el error se produjo debido a que la aplicación no se le permitió escribir, gracias de todos modos
underfilho
12

/data/data/packagename/databases/

es decir

/data/data/com.example.program/databases/

Ray Britton
fuente
9

Una base de datos SQLite es solo un archivo. Puede tomar ese archivo, moverlo e incluso copiarlo a otro sistema (por ejemplo, desde su teléfono a su estación de trabajo), y funcionará bien. Android almacena el archivo en el /data/data/packagename/databases/directorio. Puede usar adb commando File Explorer viewen Eclipse ( Window > Show View > Other... > Android > File Explorer) para verlo, moverlo o eliminarlo.

HalosTecnologías
fuente
9

bueno, esto podría ser tarde pero ayudará. Puede acceder a la base de datos sin rootear su dispositivo a través de adb

inicie el adb usando cmd y escriba los siguientes comandos

-run-as com.your.package  
-shell@android:/data/data/com.your.package $ ls  
cache  
databases  
lib  
shared_prefs  

Ahora puedes abrir desde aquí.

Ahmad Ali Nasir
fuente
4
Sí, para un APK de depuración. No, para uno de producción (o en versiones de Android donde ejecutar como está roto).
Chris Stratton
5

Si nombra su db como un archivo sin dar una ruta, la forma más común de obtener su carpeta es como:

final File dbFile = new File(getFilesDir().getParent()+"/databases/"+DBAdapter.DATABASE_NAME);

donde DBAdapter.DATABASE_NAMEes Stringcomo "mydatabase.db".
Context.getFilesDir()devuelve la ruta para los archivos de la aplicación como: /data/data/<your.app.packagename>/files/por eso es necesario .getParent()+"/databases/", para eliminar "archivos" y agregar "bases de datos" en su lugar.
Por cierto, Eclipse le advertirá sobre la cadena "data / data /" codificada, pero no en este caso.

Stan
fuente
3
By Default it stores to:    

String DATABASE_PATH = "/data/data/" + PACKAGE_NAME + "/databases/" + DATABASE_NAME;

Where:

String DATABASE_NAME = "your_dbname";
String PACKAGE_NAME = "com.example.your_app_name";

Y verifique si su base de datos está almacenada en Device Storage. Si es así, debe usar el permiso en Manifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Crime_Master_GoGo
fuente
3

Puede acceder a él usando adb shell cómo hacerlo

Contenido del enlace anterior:

Tutorial: Cómo acceder a una base de datos de Android usando una línea de comando. Cuando comience a trabajar con una base de datos en su programa, es realmente importante y útil poder acceder a ella directamente, fuera de su programa, para verificar lo que acaba de hacer el programa y para depurar.

Y es importante también en Android.

He aquí cómo hacerlo:

1) Inicie el emulador (o conecte su dispositivo real a su PC). Normalmente lanzo uno de mis programas desde Eclipse para esto. 2) Inicie un símbolo del sistema en el directorio de herramientas de Android. 3) escriba adb shell. Esto lanzará un shell de Unix en su emulador / dispositivo conectado. 4) ve al directorio donde está tu base de datos: cd data / data aquí tienes la lista de todas las aplicaciones en tu dispositivo Ve al directorio de tu aplicación (¡cuidado, Unix distingue entre mayúsculas y minúsculas!) Cd com.alocaly.LetterGame y desciende en su directorio de bases de datos: bases de datos cd Aquí puede encontrar todas sus bases de datos. En mi caso, solo hay uno (ahora): SCORE_DB 5) Inicie sqlite en la base de datos que desea verificar / cambiar: sqlite3 SCORE_DB Desde aquí, puede verificar qué tablas están presentes: .tables 6) ingrese cualquier instrucción SQL que desee : seleccione * de Score;

Esto es bastante simple, pero cada vez que lo necesito, no sé dónde encontrarlo.

Dawid Drozd
fuente
1

Si su aplicación crea una base de datos, esta base de datos se guarda de forma predeterminada en el directorio DATA/data/APP_NAME/databases/FILENAME.

Las partes del directorio anterior se construyen según las siguientes reglas. DATA es la ruta que devuelve el método Environment.getDataDirectory (). APP_NAME es el nombre de su aplicación. FILENAME es el nombre que especifica en el código de su aplicación para la base de datos.

AndroidGeek
fuente
0

También puede verificar si su IDE tiene una utilidad como la perspectiva DDMS de Eclipse que le permite navegar por el directorio y / o copiar archivos desde y hacia el emulador o un dispositivo rooteado.

korosmatick
fuente
0

Defina el nombre de su base de datos como:

private static final String DATABASE_NAME = "/mnt/sdcard/hri_database.db";

Y puedes ver tu base de datos en:

storage/sdcard0/yourdatabasename.db
Pankaj Arora
fuente
0

La clase pública MySQLiteOpenHelper extiende SQLiteOpenHelper {MySQLiteOpenHelper (Context context) {super (context, "/mnt/sdcard/database_name.db", null, 0); }}

No codifique "/ sdcard /"; use Environment.getExternalStorageDirectory (). getPath () en su lugar

Namo
fuente
0

No codifique la ruta como //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Bueno, funciona en la mayoría de los casos, pero este no funciona en dispositivos donde el dispositivo puede admitir múltiples usuarios. El camino puede ser como //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. Una posible solución a esto está usando context.getDatabasePath(<your-database-name>).

Vytautas Berankis
fuente