Emplacement de la base de données sqlite sur l'appareil

100

J'ai créé une base de données sqlite par programme avec la méthode par défaut d'extension SQLiteOpenHelperet de remplacement onCreate(). De cette façon, la base de données est créée à la volée en cas de besoin.

Je voudrais vérifier le contenu du fichier db sur ma machine OS X avec un navigateur sqlite. Je connais le nom du fichier db, mais je ne le trouve pas sur l'appareil. Je me suis connecté à l'appareil via USB et j'ai regardé avec le viseur et le terminal, mais je ne trouve tout simplement pas le fichier db.

Quel est l'emplacement par défaut d'une base de données sqlite sur un appareil Android?

Pompair
la source

Réponses:

96

Vous pouvez trouver votre base de données créée, nommée <your-database-name>

dans

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

Extrayez-le à l'aide de l'explorateur de fichiers et renommez-le pour avoir l'extension .db3 pour l'utiliser dans SQLiteExplorer

Utilisez l'explorateur de fichiers de DDMS pour accéder au répertoire de l'émulateur.

Shardul
la source
1
Lorsque j'essaye cela dans un émulateur, je peux accéder à / data. Mais lorsque j'essaye cela avec mon Galaxy Vibrant connecté, je ne peux pas effectuer de cd vers / data. Le serveur adb fonctionne-t-il comme une utilisation différente dans ces deux cas?
Robᵩ
42
Vous n'avez pas accès au dossier / data sur un vrai téléphone. C'est chmoded 700. Vous avez besoin des privilèges root pour le voir.
Falmarri
15
Juste au cas où vous souhaiteriez obtenir le chemin depuis l'application , il s'agit de context.getDatabasePath ("<your-database-name>"). Ce qui renvoie en fait le chemin ci-dessus. Vous pouvez accéder à ce chemin en lecture-écriture, mais uniquement à partir de l'application qui a créé la base de données.
Yaroslav Mytkalyk
Le chemin par défaut où Android enregistre les bases de données ne peut pas être accédé sur les appareils non rootés. Ainsi, le moyen le plus simple d'accéder au fichier de base de données (uniquement pour les environnements de débogage) est de modifier le constructeur de la classe. Quelques réponses après celle-ci (exactement ici: stackoverflow.com/a/21832714/2982814 ), vous trouverez comment j'ai géré cela.
RandomUser
45

Pour cela, ce que j'ai fait est

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

Et pour ce faire, votre application doit avoir l'autorisation d'accéder à la carte SD, ajoutez le paramètre suivant à votre manifest.xml

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

Pas une manière brillante, mais fonctionne.

RRTW
la source
Agréable. Je cherchais ceci. On pourrait également choisir de télécharger la base de données complète sur un serveur pour analyse de cette façon.
Jeroen
3
si cela ne fonctionne pas ... utilisez le nom de la base de données "/data/data/your.app.package/databases/your_db" Supprimez simplement l'extension ".db3"
Nigel Crasto
1
Cette solution fonctionne très bien. Mais, vous pouvez utiliser getDatabasePath (your_db_name) pour obtenir l'objet File et utiliser getAbsolutePath () pour obtenir un chemin précis au lieu de le construire. La méthode getDatabasePath est définie dans ContextWrapper.
Roy
Les noms de fichier et de chemin sont sensibles à la casse sous Android.
AndroidDev
30

Le contexte contient de nombreuses fonctions de chemin: Context.getXXXPath ()
L'une d'elles est android.content.Context.getDatabasePath (String dbname) qui renvoie le chemin absolu d'une base de données appelée dbname.

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

Le chemin retourné, dans ce cas, serait quelque chose comme:

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

Notez que ce chemin est généré automatiquement si vous utilisez SQLiteOpenHelper pour ouvrir la base de données.

Shoham
la source
25

Si vous parlez d'un appareil réel /data/data/<application-package-name>n'est pas accessible. Vous devez avoir les droits root ...

Étoile rouge Barmaley
la source
Ce n'est pas tout à fait vrai. Ce n'est pas navigable , mais l' accessibilité des fichiers à l'intérieur dépend de leurs bits d'autorisation individuels.
Chris Stratton
Mon téléphone est enraciné. Comment puis-je "parcourir" le dossier de données?
Sreecharan Desabattula
@SreecharanDesabattula, vous devez accéder au shell adb et passer en superutilisateur en utilisant la commande "su" pour parcourir le répertoire.
Gautham C.
/ system / bin / sh: su: not found
Sunnyday
@Sunnyday Trysudo su
Mohammedsalim Shivani
19

C'est une vieille question, mais y répondre peut aider les autres.

Le chemin par défaut où Android enregistre les bases de données ne peut pas être accédé sur les appareils non rootés. Ainsi, le moyen le plus simple d'accéder au fichier de base de données (uniquement pour les environnements de débogage) est de modifier le constructeur de la classe:

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

N'oubliez pas de changer d'environnement de production avec ces lignes:

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    MySQLiteOpenHelper(Context context) {
        super(context, "database_name.db", null, 0);
    }
}
RandomUser
la source
J'ai essayé et renvoyé l'erreur Failed to open database '/mnt/sdcard/itens'.dansLogcat
underfilho
2
Je suis vraiment désolé. Cette réponse a quatre ans. Et l'OP est plus ancien que ça (2010). Pour le moment, Android est très différent de 2010. Ainsi, l'emplacement de la base de données peut être dans un autre chemin. Je suis désolé de ne pas pouvoir vous être plus utile.
RandomUser
Peut-être que l'erreur s'est produite parce que l'application n'a pas été autorisée à écrire, merci quand même
underfilho
12

/data/data/packagename/databases/

c'est à dire

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

Ray Britton
la source
9

Une base de données SQLite n'est qu'un fichier. Vous pouvez prendre ce fichier, le déplacer et même le copier sur un autre système (par exemple, de votre téléphone vers votre poste de travail), et cela fonctionnera correctement. Android stocke le fichier dans le /data/data/packagename/databases/répertoire. Vous pouvez utiliser le adb commandou File Explorer viewdans Eclipse ( Window > Show View > Other... > Android > File Explorer) pour l'afficher, le déplacer ou le supprimer.

HalosTechnologies
la source
9

Eh bien, cela pourrait être tard, mais cela aidera. Vous pouvez accéder à la base de données sans rooter votre appareil via adb

démarrez l'adb en utilisant cmd et tapez les commandes suivantes

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

Maintenant, vous pouvez ouvrir à partir d'ici.

Ahmad Ali Nasir
la source
4
Oui, pour un APK de débogage. Non, pour une production (ou sur les versions Android où l'exécution en tant que tel est interrompue).
Chris Stratton
5

Si vous nommez votre base de données en tant que fichier sans donner de chemin, le moyen le plus courant d'obtenir son dossier est le suivant:

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

DBAdapter.DATABASE_NAMEest juste un Stringcomme "mydatabase.db".
Context.getFilesDir()renvoie le chemin des fichiers de l'application comme: /data/data/<your.app.packagename>/files/c'est pourquoi vous devez .getParent()+"/databases/", pour supprimer les «fichiers» et ajouter des «bases de données» à la place.
BTW Eclipse vous avertira de la chaîne "data / data /" codée en dur mais pas dans ce cas.

Stan
la source
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";

Et vérifiez si votre base de données est stockée dans le stockage de l'appareil. Si tel est le cas, vous devez utiliser l'autorisation dans Manifest.xml:

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

Vous pouvez y accéder en utilisant adb shell how-to

Contenu du lien ci-dessus:

Tutoriel: Comment accéder à une base de données Android à l'aide d'une ligne de commande. Lorsque vous commencez à traiter une base de données dans votre programme, il est vraiment important et utile de pouvoir y accéder directement, en dehors de votre programme, de vérifier ce que le programme vient de faire, et de déboguer.

Et c'est important aussi sur Android.

Voici comment procéder:

1) Lancez l'émulateur (ou connectez votre appareil réel à votre PC). Je lance généralement un de mes programmes depuis Eclipse pour cela. 2) Lancez une invite de commande dans le répertoire des outils Android. 3) tapez le shell adb. Cela lancera un shell unix sur votre émulateur / appareil connecté. 4) allez dans le répertoire où se trouve votre base de données: cd data / data ici vous avez la liste de toutes les applications de votre appareil Allez dans votre répertoire d'applications (attention, Unix est sensible à la casse !!) cd com.alocaly.LetterGame et descendez dans votre répertoire de bases de données: cd databases Ici vous pouvez trouver toutes vos bases de données. Dans mon cas, il n'y en a qu'un (maintenant): SCORE_DB 5) Lancez sqlite sur la base de données que vous souhaitez vérifier / modifier: sqlite3 SCORE_DB De là, vous pouvez vérifier quelles tables sont présentes: .tables 6) entrez toute instruction SQL que vous voulez : sélectionnez * dans Score;

C'est assez simple, mais chaque fois que j'en ai besoin, je ne sais pas où le trouver.

Dawid Drozd
la source
1

Si votre application crée une base de données, cette base de données est par défaut enregistrée dans le répertoire DATA/data/APP_NAME/databases/FILENAME.

Les parties du répertoire ci-dessus sont construites sur la base des règles suivantes. DATA est le chemin que renvoie la méthode Environment.getDataDirectory (). APP_NAME est le nom de votre application. FILENAME est le nom que vous spécifiez dans votre code d'application pour la base de données.

AndroidGeek
la source
0

Vous pouvez également vérifier si votre IDE dispose d'un utilitaire tel que la perspective DDMS d'Eclipse qui vous permet de parcourir le répertoire et / ou de copier des fichiers vers et depuis l'émulateur ou un périphérique enraciné.

Korosmatick
la source
0

Définissez le nom de votre base de données comme:

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

Et vous pouvez voir votre base de données dans:

storage/sdcard0/yourdatabasename.db
Pankaj Arora
la source
0

classe publique MySQLiteOpenHelper étend SQLiteOpenHelper {MySQLiteOpenHelper (contexte de contexte) {super (contexte, "/mnt/sdcard/database_name.db", null, 0); }}

Ne codez pas en dur "/ sdcard /"; utilisez plutôt Environment.getExternalStorageDirectory (). getPath ()

Namo
la source
0

Ne pas coder en dur le chemin comme //data/data/<Your-Application-Package-Name>/databases/<your-database-name>. Eh bien, cela fonctionne dans la plupart des cas, mais celui-ci ne fonctionne pas dans les appareils où l'appareil peut prendre en charge plusieurs utilisateurs. Le chemin peut être comme //data/user/10/<Your-Application-Package-Name>/databases/<your-database-name>. La solution possible à cela consiste à utiliser context.getDatabasePath(<your-database-name>).

Vytautas Berankis
la source