Comment afficher mon fichier Realm dans le navigateur Realm?

127

Je viens de découvrir Realm et je voulais l'explorer plus en détail.J'ai donc décidé de créer un exemple d'application et de m'embêter avec. Jusqu'ici tout va bien.

Cependant, une chose que je n'ai pas encore pu comprendre est de savoir comment afficher ma base de données dans le navigateur de royaume. Comment cela peut-il être fait?

Andy Joyce
la source
VOUS VOULEZ LA VOIE FACILE? Ignorez la journalisation des chemins, les commandes adb et les maux de tête. @devsmash a la réponse: stackoverflow.com/a/49705298/483520
Nolan Amy

Réponses:

131

Actuellement, le navigateur de royaume ne prend pas en charge l'accès aux bases de données directement sur l'appareil, vous devez donc copier la base de données à partir de l'émulateur / du téléphone pour l'afficher. Cela peut être fait en utilisant ADB:

adb pull /data/data/<packagename>/files/ .

Cette commande extraira tous les fichiers Realm créés avec Realm.getInstance(new RealmConfiguration.Builder().build()). La base de données par défaut est appelée default.realm.

Notez que cela ne fonctionnera que sur un émulateur ou si l'appareil est rooté.

Christian Melchior
la source
25
Vous pouvez également enregistrer le chemin exact de votre application avec: Log.d ("", "path:" + realm.getPath ());
bmunk
39
Donc Realm Browser pour Mac est inutile. Qui utilise l'émulateur
Jemshit Iskenderov
10
Pour les appareils non rootés, ce script fonctionne: gist.github.com/jk2K/a66ed67b252b880824b32dd4952d1b39
jmartinalonso
3
si vous obtenez une erreur comme un fichier non trouvé, exécutez d'abord la commande adb root avant d'extraire le fichier de domaine.
randy
Cela fonctionne après avoir utilisé adb root, mais peu importe ce que je fais, le fichier de domaine dit qu'il est crypté lors de l'utilisation de realm browsersr. Oui, j'ai lu sur la corruption et autres, mais rien de ce que j'essaie ne fonctionne du tout. Quelque chose a-t-il changé dans le royaume?
Mike Axle
104

Vous pouvez maintenant afficher Realm DB sur le navigateur Chrome à l'aide de Stetho , développé par Facebook. Par défaut, Stetho permet de visualiser Sqlite, réseau, préférences partagées mais avec un plugin supplémentaire ici permet également de visualiser le royaume.

Après avoir configuré votre Applicationclasse avec les bibliothèques ci-dessus, pendant que l'application est en cours d'exécution et connectée, ouvrez le navigateur Chrome et naviguez chrome://inspectpour voir


entrez la description de l'image ici

ensuite Resources->Web Sql->default.realm


entrez la description de l'image ici

Jemshit Iskenderov
la source
2
Échec de la résolution: com.uphyca: stetho_realm: 0.8.0 Quelqu'un peut-il m'aider? Je suis désolé, je ne suis pas un utilisateur de mac, il semble donc que ce soit le seul que je puisse parcourir mon fichier de base de données.
Attention7j
4
Avez-vous ajouté l'url https://github.com/uPhyca/stetho-realm/raw/master/maven-repocomme indiqué ici github.com/uPhyca/stetho-realm
Jemshit Iskenderov
2
Ma faute, merci beaucoup! J'ai manqué ça. Maintenant, cela fonctionne comme il se doit!
attention7j
1
Je regarde les changements du tableau "A" en cliquant sur un autre tableau, puis en cliquant à nouveau sur le tableau "A" @AlexKost
Jemshit Iskenderov
1
voir ce post si quelqu'un a des problèmes pour voir les champs: github.com/uPhyca/stetho-realm/issues/45 .... Je vois mes champs mais pas de données .... hmmm
Mike6679
56

Vous pouvez également extraire votre fichier de n'importe quel périphérique NON rooté à l'aide du shell ADB et de la commande run-as.

Vous pouvez utiliser ces commandes pour extraire du stockage privé de votre application une base de données nommée your_database_file_name située dans le dossier files:

adb shell "run-as package.name chmod 666 /data/data/package.name/files/your_database_file_name"

// For devices running an android version lower than Android 5.0 (Lollipop)
adb pull /data/data/package.name/files/your_database_file_name

// For devices running an Android version equal or grater
// than Android 5.0 (Lollipop)
adb exec-out run-as package.name cat files/your_database_file_name > your_database_file_name
adb shell "run-as package.name chmod 600 /data/data/package.name/files/your_database_file_name"
Apperside
la source
3
D'accord. Puisque nous pouvons définir l'application sur déboguable, nous pouvons extraire le fichier avec cela sans racine.
JoshuaTree
existe-t-il un autre moyen d'extraire la base de données d'un apk non déboguable?
JEGADEESAN S
si cela était possible, l'ensemble du système d'exploitation Android serait complètement dangereux, il y a une chance que cela ne soit possible que sur les appareils enracinés, mais je ne l'ai jamais fait
Apperside
Cela peut ne pas fonctionner sur les appareils Samsung en raison de leurs implémentations boguées.
SkorpEN
Alors, nous pouvons l'utiliser pour importer notre royaume édité à sa place? adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender le
52

Si vous êtes paresseux pour obtenir le fichier de base de données de royaume à chaque fois avec adb, vous pouvez ajouter une fonction d'exportation à votre code Android, qui vous enverra un e-mail avec le fichier de base de données de royaume en pièce jointe.

Voici un exemple:

public void exportDatabase() {

    // init realm
    Realm realm = Realm.getInstance(getActivity());

    File exportRealmFile = null;
    try {
        // get or create an "export.realm" file
        exportRealmFile = new File(getActivity().getExternalCacheDir(), "export.realm");

        // if "export.realm" already exists, delete
        exportRealmFile.delete();

        // copy current realm to "export.realm"
        realm.writeCopyTo(exportRealmFile);

    } catch (IOException e) {
        e.printStackTrace();
    }
    realm.close();

    // init email intent and add export.realm as attachment
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("plain/text");
    intent.putExtra(Intent.EXTRA_EMAIL, "YOUR MAIL");
    intent.putExtra(Intent.EXTRA_SUBJECT, "YOUR SUBJECT");
    intent.putExtra(Intent.EXTRA_TEXT, "YOUR TEXT");
    Uri u = Uri.fromFile(exportRealmFile);
    intent.putExtra(Intent.EXTRA_STREAM, u);

    // start email intent
    startActivity(Intent.createChooser(intent, "YOUR CHOOSER TITLE"));
}

N'oubliez pas d'ajouter cette autorisation d'utilisateur à votre fichier de manifeste Android:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ruclip
la source
3
Ceci est particulièrement utile si vous utilisez Pushbullet . Ensuite, vous pouvez envoyer un message à votre navigateur Chrome et il téléchargera le fichier. Le fichier peut ensuite être ouvert dans Realm Browser
ymerdrengene
1
Crashing sur Android 8.0
EGHDK
42

Pour Android (pas besoin de rooter votre appareil)

Pour obtenir une copie de l'une des bases de données Realm sur votre appareil, accédez à Device File Explorer dans Android Studio.

Accédez à /data/data/your.package.name/files/.

Vous y trouverez vos fichiers * .realm. Faites un clic droit, puis Enregistrer sous . Assurez-vous de synchroniser avant de les enregistrer.

Utilisez Realm Browser ou l'un de ceux - ci pour afficher les fichiers * .realm:

Entrez la description de l'image ici

krhitesh
la source
2
Une solution aussi simple, cela devrait maintenant être la réponse
Steven Elliott
Absolument. Ceci est le chemin. 🙏
Nolan Amy
Assurez-vous que votre application est définie sur debuggable false afin d'afficher les données.
Aman Verma
@AmanVerma C'est le débogage USB dans les options du développeur. Le débogage USB doit être activé pour utiliser l'explorateur de fichiers de périphérique
krhitesh
L'utilisateur Linux peut télécharger realm studio en utilisant realm.io/products/realm-studio et ouvrir le fichier realm à partir de là
B.shruti
19

Il existe une solution de contournement. Vous pouvez accéder directement au fichier à partir du moniteur de périphérique. Vous ne pouvez accéder à ce répertoire que lorsque vous utilisez un émulateur ou un périphérique rooté.

Dans Android Studio:

Sélectionner

Outils de menu → AndroidMoniteur de périphérique AndroidExplorateur de fichiersdonnéesdonnées → (nom de votre package) → fichiers → * db.realm

Extrayez ce fichier de l'appareil:

Entrez la description de l'image ici

Depuis Android Studio 3 canary 1, Device File Explorer a été introduit. Vous devez consulter le fichier de domaine ici. Ensuite, (sélectionnez votre package) → sélectionnez le fichier de royaume → Faites un clic droit et enregistrez.

Entrez la description de l'image ici

Et ouvrez le fichier dans le navigateur Realm. Vous pouvez voir vos données maintenant.

Aveek
la source
Merci. Cependant, cela ne fonctionne pas avec un appareil réel.Il ne fonctionne qu'avec Emulator
pratham kesarkar
1
@prathamkesarkar, c'est pourquoi j'ai écrit un émulateur ou un périphérique enraciné car vous ne pouvez pas accéder à ces dossiers dans un périphérique normal.
Aveek
14

Vous pouvez accéder directement au fichier de domaine. Voici la solution que j'ai utilisée.

Vous pouvez d'abord copier le fichier de domaine qui se trouve dans '/ data / data / packagename / files' dans Environment.getExternalStorageDirectory () + '/ FileName.realm':

public class FileUtil {
    public static void copy(File src, File dst) throws IOException {
        InputStream in = new FileInputStream(src);
        OutputStream out = new FileOutputStream(dst);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }
}

Realm realm = null;
try {
    realm = Realm.getInstance(this);
        File f = new File(realm.getPath());
        if (f.exists()) {
            try {
                FileUtil.copy(f, new File(Environment.getExternalStorageDirectory()+"/default.realm"));
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
}
finally {
    if (realm != null)
        realm.close();
}

Deuxièmement, utilisez l'outil ADB pour extraire ce fichier comme ceci:

$ adb pull /sdcard/default.realm.

Vous pouvez maintenant ouvrir le fichier dans le navigateur de royaume.

Rooney
la source
6

Voici une solution qui ne nécessite pas que votre téléphone soit rooté, en utilisant la run-ascommande présente à adbl' intérieur du shell. La seule condition préalable est que vous devez avoir une version de débogage de votre application installée sur le téléphone cible.

$ adb shell
$ run-as com.yourcompany.yourapp # pwd will return /data/data/com.yourcompany.yourapp
$ cp files/default.realm /sdcard
$ exit
$ exit
$ adb pull /sdcard/default.realm ~/Desktop # or wherever you want to put it

Vous aurez une copie de la base de données de n'importe quel téléphone dans votre répertoire local, que vous pourrez ensuite charger dans le navigateur de royaume.

Pedro Alvarez-Tabio
la source
1
chemin par défaut de mac adb ... / Bibliothèque / Android / sdk / platform-tools
Francisco Castro
3

Vous pouvez désormais y accéder directement si vous utilisez un émulateur.

Commencez par enregistrer le chemin où se trouve le fichier dans l'émulateur comme @bmunk dit:

Log.d(TAG, "path: " + realm.getPath());

Deuxième Recherchez-le et faites un clic droit sur le fichier et choisissez "Enregistrer sous", dans la boîte de dialogue apparaîtra la route où le fichier se trouve réellement dans votre système.

entrez la description de l'image ici Vous pouvez copier l'itinéraire à partir de la boîte de dialogue Enregistrer sous

Et puis, collez simplement la route dans la boîte de dialogue "Ouvrir un fichier local" de Realm Studio.

(J'ai testé cela sous Windows uniquement)

Brugui
la source
1
C'est la réponse la plus utile, merci! N'affiche pas le chemin pour macOS, mais il est toujours facile de localiser le fichier.
Maria
1

Voici mon script shell prêt à l'emploi. Changez simplement le nom du package et vos chemins adb, puis le script fera le nécessaire.

#!/bin/sh
ADB_PATH="/Users/medyo/Library/Android/sdk/platform-tools"
PACKAGE_NAME="com.mobiacube.elbotola.debug"
DB_NAME="default.realm"
DESTINATION_PATH="/Users/Medyo/Desktop/"
NOT_PRESENT="List of devices attached"
ADB_FOUND=`${ADB_PATH}/adb devices | tail -2 | head -1 | cut -f 1 | sed 's/ *$//g'`
if [[ ${ADB_FOUND} == ${NOT_PRESENT} ]]; then
    echo "Make sure a device is connected"
else
    ${ADB_PATH}/adb shell "
        run-as ${PACKAGE_NAME} cp /data/data/${PACKAGE_NAME}/files/${DB_NAME} /sdcard/
        exit
    "
    ${ADB_PATH}/adb pull "/sdcard/${DB_NAME}" "${DESTINATION_PATH}"
    echo "Database exported to ${DESTINATION_PATH}${DB_NAME}"
fi

Plus de détails sur ce billet de blog: http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-android/

Mehdi Sakout
la source
1

Rester simple:

/Users/inti/Library/Android/sdk/platform-tools/adb exec-out run-as com.mydomain.myapp cat files/default.realm > ~/Downloads/default.realm

Explication:

  1. Trouvez le chemin de votre adbinstallation. Si vous utilisez Android Studio, regardez Fichier> Structure du projet> Emplacement du SDK> Emplacement du SDK Android et ajoutez platform-toolsà ce chemin.
  2. Utilisez le nom complet de votre application pour l' run-asargument
  3. Décidez où vous souhaitez copier le fichier de domaine

NB: Le fichier s'appelle default.realm car je n'ai pas changé son nom lors de sa configuration - le vôtre peut être différent.

Inti
la source
1

Vous avez quelques options pour afficher vos fichiers de royaume Android:

  1. Comme @Christian Melchior a dit que vous pouvez extraire votre base de données de royaume de l'appareil et l'ouvrir sur votre Mac à l'aide du navigateur OSX Realm

  2. Vous pouvez utiliser le navigateur tiers Android Realm que j'ai créé pour faciliter un peu le développement Android avec le royaume. L'application vous montrera tous les fichiers de domaine sur votre appareil et vous pourrez afficher tous vos fichiers de domaine en temps réel tout en testant votre application.

  3. Vous pouvez utiliser le navigateur Chrome Stetho La description complète de l'utilisation de Setho est fournie par @Jemshit Iskendero answer.

SocialError
la source
0

Voici une coquille pour les paresseux comme moi :)

Le .realmfichier sera stocké dans le tmpRealm/dossier à côté du .shfichier.

#!/bin/sh
adb shell 'su -c "
cd /data/data/<packagename>/files
ls
rm -rf /data/local/tmp/tmpRealm/
mkdir /data/local/tmp/tmpRealm/
cp /data/data/com.arefly.sleep/files/* /data/local/tmp/tmpRealm
chown shell.shell /data/local/tmp/tmpRealm/*
"'
rm -rf ./tmpRealm/
adb pull /data/local/tmp/tmpRealm ./

Ou si vous préférez laisser tmpRealm/être sur la carte SD:

#!/bin/sh
adb shell 'su -c "
cd /data/data/com.arefly.sleep/files
ls
mount -o rw,remount $EXTERNAL_STORAGE/
rm -rf $EXTERNAL_STORAGE/tmpRealm
mkdir $EXTERNAL_STORAGE/tmpRealm
cp /data/data/com.arefly.sleep/files/* $EXTERNAL_STORAGE/tmpRealm
"'
rm -rf ./tmpRealm/
# http://unix.stackexchange.com/a/225750/176808
adb pull "$(adb shell 'echo "$EXTERNAL_STORAGE"' | tr -d '\r')/tmpRealm" ./

Référence:

  1. https://stackoverflow.com/a/28486297/2603230
  2. https://android.stackexchange.com/a/129665/179720
He Yifei 何 一 非
la source