2015-03-05 1 views
2

En général, quand je veux voir le contenu d'une base de données SQLite, j'utiliser l'exécutable sqlite3 et lui donner des commandes comme:Comment faire pour déboguer la base de données SQLite à partir de SQLite Openhelper?

.open MYDATABASE.db 
SELECT * FROM myUserTable; 

Il délivre alors ma table via la ligne de commande et il est très facile de voir le contenu de quoi que ce soit dans ma base de données.

Malheureusement, la base de données SQLite avec laquelle je travaille n'a même pas de fichier .db associé. Il s'étend d'une classe appelée SQLiteOpenHelper. La classe réside dans un fichier appelé DBHandler.java, mais il est évident que tenter d'exécuter des instructions de ligne de commande (c'est-à-dire comme je suis habitué) échoue dans cette instance.

Est-ce que quelqu'un sait comment déboguer une base de données SQLite qui s'étend de SQLiteOpenHelper?

Répondre

1

Vous pouvez utiliser le cursor pour voir le contenu de votre sqliteDb:

public Cursor selectRecords() { 
    String[] cols = new String[] {USER_ID, USER_NAME}; 
    Cursor mCursor = database.query(true, USER_TABLE,cols,null 
      , null, null, null, null, null); 
    if (mCursor != null) { 
    mCursor.moveToFirst(); 
    } 
    return mCursor; // iterate to get each value. 
} 
1

Vous pouvez utiliser ci-dessous code pour extraire la base de données dans un dossier accessible sur votre appareil:

try { 
        File sd = Environment.getExternalStorageDirectory(); 
        File data = Environment.getDataDirectory(); 

        if (sd.canWrite()) { 
         String currentDBPath = "/data/" + getPackageName() + "/databases/yourdatabasename"; 
         String backupDBPath = "backupname.db"; 
         File currentDB = new File(currentDBPath); 
         File backupDB = new File(sd, backupDBPath); 

         if (currentDB.exists()) { 
          FileChannel src = new FileInputStream(currentDB).getChannel(); 
          FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
          dst.transferFrom(src, 0, src.size()); 
          src.close(); 
          dst.close(); 
         } 
        } 
       } catch (Exception e) { 

       } 

puis ouvrez votre fichier.db avec votre outil favori.

EDIT: vous devez ajouter la permission d'écrire sur votre appareil dans votre fichier manifeste.

1

La base de données doit exister. Pour trouver son nom voir DBHandler (s'étend SQLiteOpenHelper) aura un constructeur avec quelque chose comme ceci:

public DBHandler(Context context) { 
    super(context, your_database_name, null, your_database_version); 
    ... 
} 

Le nom de base de données peut être arbitraire (avec ou sans extension) et vous trouverez dans /data/data/<your_package_name>/databases/<your_database_name>

Here Vous trouverez quelques conseils pour accéder à ce fichier.

Avertissement: l'accès au fichier interne est accordé dans les périphériques émulés mais les périphériques réels doivent être rootés. Vous pouvez créer une méthode utilitaire dans votre application (uniquement en mode débogage) pour automatiser le processus de copie comme indiqué dans une autre réponse ici.

J'espère que ça aide!

+0

Je suis conscient de ce constructeur et il est présent dans le code source. J'ai trouvé le nom dans le constructeur, mais je ne trouve pas le fichier .db n'importe où dans le projet. Son nom est "movieManager". – MrPickles

+0

@MrPickles Ok. Je suppose que nous sommes au milieu maintenant. J'ai mis à jour ma réponse pour vous donner plus de conseils sur l'accès à ce fichier. Bon travail! – ARNeto

1

Vous pouvez utiliser idée IntelliJ et plugin base de données
plugin de base de données peut se connecter à la base de données dans votre appareil, pour le débogage très cool))

+0

Merci. Avez-vous un pluggin à recommander? – ARNeto

+0

IntellIJ IDEA Ultimate Edition a un plugin de base de données par défaut, qui peut se connecter à un périphérique ou un émulateur, dispose d'un éditeur SQL pratique et de nombreuses autres fonctionnalités – gadfil