Localização do banco de dados sqlite no dispositivo

100

Eu criei um banco de dados sqlite programaticamente com a maneira padrão de estender SQLiteOpenHelpere substituir onCreate(). Desta forma, o banco de dados é criado instantaneamente quando necessário.

Gostaria de verificar o conteúdo do arquivo db na minha máquina OS X com um navegador sqlite. Eu sei o nome do arquivo db, mas não consigo localizá-lo no dispositivo. Eu conectei o dispositivo via USB e procurei no localizador e no terminal, mas simplesmente não consigo encontrar o arquivo db.

Qual é o local padrão para bancos de dados sqlite em um dispositivo Android?

Pompair
fonte

Respostas:

96

Você pode encontrar o banco de dados criado, chamado <your-database-name>

no

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

Retire-o usando o Explorador de arquivos e renomeie-o para ter a extensão .db3 para usá-lo no SQLiteExplorer

Use o explorador de arquivos do DDMS para navegar até o diretório do emulador.

Shardul
fonte
1
Quando tento isso em um emulador, posso fazer cd para / data. Mas quando tento fazer isso com meu Galaxy Vibrant conectado, não consigo fazer cd para / data. O servidor adb funciona com um uso diferente nesses dois casos?
Robᵩ
42
Você não tem acesso à pasta / data em um telefone real. É chmoded 700. Você precisa de privilégios de root para vê-lo.
Falmarri
15
Por precaução, se você quiser obter o caminho do aplicativo , é context.getDatabasePath ("<your-database-name>"). O que na verdade retorna o caminho acima. Você pode acessar este caminho para leitura e gravação, mas apenas a partir do aplicativo que criou o banco de dados.
Yaroslav Mytkalyk
O caminho padrão onde o Android salva bancos de dados não pode ser acessado em dispositivos sem acesso root. Portanto, a maneira mais fácil de acessar o arquivo de banco de dados (apenas para ambientes de depuração) é modificar o construtor da classe. Algumas respostas depois dessa (exatamente aqui: stackoverflow.com/a/21832714/2982814 ), você descobrirá como consegui fazer isso.
RandomUser de
45

Para isso, o que eu fiz foi

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)
  {}
}

E para fazer isso, seu aplicativo deve ter permissão para acessar o cartão SD, adicione a seguinte configuração ao seu manifest.xml

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

Não é uma maneira brilhante, mas funciona.

RRTW
fonte
Agradável. Eu estava procurando por isso. Pode-se também optar por fazer o upload do banco de dados completo para um servidor para análise desta forma.
Jeroen
3
se não funcionar ... use o nome do banco de dados "/data/data/your.app.package/databases/your_db" Simplesmente remova a extensão ".db3"
Nigel Crasto
1
Esta solução funciona bem. Mas, você pode usar getDatabasePath (your_db_name) para obter o objeto File e usar getAbsolutePath () para obter o caminho preciso em vez de construí-lo. O método getDatabasePath é definido em ContextWrapper.
Roy,
Os nomes de arquivo e caminho diferenciam maiúsculas de minúsculas no Android.
AndroidDev
29

O Contexto contém muitas funções de caminho: Context.getXXXPath ()
Uma delas é android.content.Context.getDatabasePath (String dbname) que retorna o caminho absoluto de um banco de dados chamado dbname.

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

O caminho retornado, neste caso, seria algo como:

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

Observe que esse caminho é gerado automaticamente se estiver usando SQLiteOpenHelper para abrir o banco de dados.

Shoham
fonte
25

Se você está falando sobre o dispositivo real /data/data/<application-package-name>é inacessível. Você deve ter direitos de root ...

Barmaley Red Star
fonte
Isso não é exatamente verdade. Não é navegável , mas a acessibilidade dos arquivos depende de seus bits de permissão individuais.
Chris Stratton
Meu telefone está enraizado. Como posso "navegar" na pasta de dados?
Sreecharan Desabattula de
@SreecharanDesabattula, você precisa ir ao shell adb e alternar para o superusuário usando o comando "su" para navegar no diretório.
Gautham C.
/ system / bin / sh: su: não encontrado
Sunnyday
@Sunnyday Trysudo su
Mohammedsalim Shivani
19

Esta é uma pergunta antiga, mas responder pode ajudar outras pessoas.

O caminho padrão onde o Android salva bancos de dados não pode ser acessado em dispositivos sem acesso root. Portanto, a maneira mais fácil de acessar o arquivo de banco de dados (apenas para ambientes de depuração) é modificar o construtor da classe:

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

Lembre-se de mudar para ambientes de produção com estas linhas:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}
RandomUser
fonte
Tentei fazer isso e retornei o erro Failed to open database '/mnt/sdcard/itens'.emLogcat
underfilho
1
Eu sinto muito. Esta resposta tem quatro anos. E o OP é mais antigo do que isso (2010). No momento, o Android é significativamente diferente de 2010. Portanto, a localização do banco de dados pode estar em outro caminho. Lamento não poder ser mais útil para você.
RandomUser
Possivelmente o erro ocorreu porque o aplicativo não foi autorizado a escrever, obrigado mesmo assim
underfilho
12

/data/data/packagename/databases/

ie

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

Ray Britton
fonte
9

Um banco de dados SQLite é apenas um arquivo. Você pode pegar esse arquivo, movê-lo e até mesmo copiá-lo para outro sistema (por exemplo, do telefone para a estação de trabalho) e ele funcionará bem. O Android armazena o arquivo no /data/data/packagename/databases/diretório. Você pode usar adb commandou File Explorer viewem Eclipse ( Window > Show View > Other... > Android > File Explorer) para visualizar, mover ou excluí-lo.

HalosTechnologies
fonte
9

bem, isso pode ser tarde, mas vai ajudar. Você pode acessar o banco de dados sem fazer root em seu dispositivo por meio do adb

inicie o adb usando cmd e digite os seguintes comandos

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

Agora você pode abrir daqui em diante.

Ahmad Ali Nasir
fonte
4
Sim, para um APK de depuração. Não, para uma produção (ou em versões do Android em que o run-as está quebrado).
Chris Stratton
5

Se você nomear seu banco de dados como um arquivo sem fornecer um caminho, a maneira mais comum de obter sua pasta é:

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

onde DBAdapter.DATABASE_NAMEé Stringcomo "meu banco de dados.db".
Context.getFilesDir()retorna o caminho para os arquivos do aplicativo como: /data/data/<your.app.packagename>/files/é por isso que você precisa .getParent()+"/databases/", remover "arquivos" e adicionar "bancos de dados" ao invés.
BTW Eclipse irá avisá-lo sobre a string "data / data /" codificada, mas não neste caso.

Stan
fonte
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";

E verifique se o seu banco de dados está armazenado no Armazenamento do dispositivo. Em caso afirmativo, você deve usar permissão em Manifest.xml:

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

Você pode acessá-lo usando adb shell how-to

Conteúdo do link acima:

Tutorial: como acessar um banco de dados Android usando uma linha de comando. Quando você começa a lidar com um banco de dados em seu programa, é muito importante e útil poder acessá-lo diretamente, fora do seu programa, para verificar o que o programa acabou de fazer e para depurar.

E é importante também no Android.

Aqui está como fazer isso:

1) Inicie o emulador (ou conecte seu dispositivo real ao PC). Normalmente eu lanço um dos meus programas do Eclipse para isso. 2) Inicie um prompt de comando no diretório de ferramentas do Android. 3) digite adb shell. Isso iniciará um shell Unix em seu emulador / dispositivo conectado. 4) vá para o diretório onde está seu banco de dados: cd data / data aqui você tem a lista de todos os aplicativos em seu dispositivo Vá para o diretório de seu aplicativo (cuidado, o Unix diferencia maiúsculas de minúsculas !!) cd com.alocaly.LetterGame e descend no diretório de seus bancos de dados: bancos de dados de cd Aqui você pode encontrar todos os seus bancos de dados. No meu caso, há apenas um (agora): SCORE_DB 5) Inicie o sqlite no banco de dados que você deseja verificar / alterar: sqlite3 SCORE_DB A partir daqui, você pode verificar quais tabelas estão presentes: .tables 6) insira qualquer instrução SQL que desejar : selecione * em Pontuação;

É muito simples, mas sempre que preciso, não sei onde encontrá-lo.

Dawid Drozd
fonte
1

Se seu aplicativo cria um banco de dados, este banco de dados é salvo por padrão no diretório DATA/data/APP_NAME/databases/FILENAME.

As partes do diretório acima são construídas com base nas seguintes regras. DATA é o caminho que o método Environment.getDataDirectory () retorna. APP_NAME é o nome do seu aplicativo. FILENAME é o nome que você especifica no código do aplicativo para o banco de dados.

AndroidGeek
fonte
0

Você também pode verificar se o seu IDE tem um utilitário como a perspectiva DDMS do Eclipse, que permite navegar pelo diretório e / ou copiar arquivos de e para o emulador ou um dispositivo com acesso root.

korosmatick
fonte
0

Defina o nome do seu banco de dados como:

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

E você pode ver seu banco de dados em:

storage/sdcard0/yourdatabasename.db
Pankaj Arora
fonte
0

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

Não fixe o código de "/ sdcard /"; use Environment.getExternalStorageDirectory (). getPath () em vez disso

Namo
fonte
0

Não codifique o caminho como //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Bem, funciona na maioria dos casos, mas este não está funcionando em dispositivos onde o dispositivo pode oferecer suporte a vários usuários. O caminho pode ser assim //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. A solução possível para isso é usar context.getDatabasePath(<your-database-name>).

Vytautas Berankis
fonte