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?


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.


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.


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.


25

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


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

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/


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.


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.


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.


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" />

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.


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.


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é.


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

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 ()


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>).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.