Wie kann ich meine Realm-Datei im Realm-Browser anzeigen?

127

Ich habe gerade Realm entdeckt und wollte es genauer untersuchen, also habe ich beschlossen, eine Beispielanwendung zu erstellen und damit herumzuspielen. So weit, ist es gut.

Eine Sache, die ich bisher noch nicht herausfinden konnte, ist das Anzeigen meiner Datenbank im Realm Browser. Wie kann das gemacht werden?

Andy Joyce
quelle
WOLLEN SIE DEN EINFACHEN WEG? Überspringen Sie die Pfadprotokollierung, ADB-Befehle und Kopfschmerzen. @ Devsmash hat die Antwort: stackoverflow.com/a/49705298/483520
Nolan Amy

Antworten:

131

Derzeit unterstützt der Realm Browser den Zugriff auf Datenbanken nicht direkt auf dem Gerät. Sie müssen die Datenbank daher vom Emulator / Telefon kopieren, um sie anzuzeigen. Dies kann mithilfe von ADB erfolgen:

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

Dieser Befehl ruft alle Realm-Dateien ab, die mit erstellt wurden Realm.getInstance(new RealmConfiguration.Builder().build()). Die Standarddatenbank wird aufgerufen default.realm.

Beachten Sie, dass dies nur auf einem Emulator funktioniert oder wenn das Gerät gerootet ist.

Christian Melchior
quelle
25
Sie können den genauen Pfad auch von Ihrer App aus protokollieren mit: Log.d ("", "path:" + Realm.getPath ());
BMunk
39
Realm Browser für Mac ist also nutzlos. Wer benutzt Emulator
Jemshit Iskenderov
10
Für Geräte ohne
Rootberechtigung
3
Wenn Sie eine Fehlermeldung erhalten, dass die Datei nicht gefunden wurde, führen Sie zuerst den Befehl adb root aus, bevor Sie die Realm-Datei abrufen.
Randy
Dies funktioniert nach der Verwendung von adb root, aber egal was ich mache, die Realm-Datei sagt, dass sie bei Verwendung von Realm Browssr verschlüsselt ist. Ja, ich habe über Korruption und dergleichen gelesen, aber nichts, was ich versuche, funktioniert überhaupt. Hat sich im Reich etwas geändert?
Mike Axle
104

Jetzt können Sie Realm DB im Chrome-Browser mit Stetho anzeigen , das von Facebook entwickelt wurde. Standardmäßig erlaubt Stetho das Anzeigen von SQLite-, Netzwerk- und gemeinsam genutzten Einstellungen, aber mit einem zusätzlichen Plugin können Sie hier auch Realm anzeigen.

ApplicationÖffnen Sie nach dem Konfigurieren Ihrer Klasse mit den oben genannten Bibliotheken, während die App ausgeführt und verbunden wird, den Chrome-Browser und navigieren Sie, um chrome://inspectzu sehen


Geben Sie hier die Bildbeschreibung ein

Dann Resources->Web Sql->default.realm


Geben Sie hier die Bildbeschreibung ein

Jemshit Iskenderov
quelle
2
Fehler beim Auflösen: com.uphyca: stetho_realm: 0.8.0 Darf mir jemand dabei helfen? Es tut mir leid, ich bin kein Mac-Benutzer. Es sieht also so aus, als ob nur so meine Datenbankdatei durchsucht werden kann.
vorsichtig7j
4
Haben Sie URL https://github.com/uPhyca/stetho-realm/raw/master/maven-repowie hier gezeigt
hinzugefügt
2
Meine Schuld, vielen Dank! Ich habe das verpasst. Jetzt funktioniert es wie es sollte!
vorsichtig7j
1
Ich beobachte die Änderungen der Tabelle "A", indem ich auf eine andere Tabelle klicke und dann erneut auf die Tabelle "A" klicke. @AlexKost
Jemshit Iskenderov
1
Sehen Sie diesen Beitrag, wenn jemand Probleme mit dem
Anzeigen von
56

Sie können Ihre Datei auch mit der ADB-Shell und dem Befehl run-as von jedem Gerät ohne Rootberechtigung abrufen.

Mit diesen Befehlen können Sie eine Datenbank mit dem Namen your_database_file_name aus dem privaten Speicher Ihrer App abrufen, die sich im Ordner files befindet:

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
quelle
3
Einverstanden. Da wir die Anwendung auf debuggbar setzen können, können wir die Datei damit ohne root ziehen.
JoshuaTree
Gibt es eine andere Möglichkeit, die Datenbank von einem nicht debuggbaren Apk abzurufen?
JEGADEESAN S
Wenn das möglich wäre, wäre das gesamte Android-Betriebssystem völlig unsicher. Es besteht die Möglichkeit, dass es nur auf
gerooteten
Dies funktioniert auf Samsung-Geräten möglicherweise nicht, da sie fehlerhaft ausgeführt werden.
SkorpEN
Können wir dies also verwenden, um unseren bearbeiteten Bereich wieder an seinen Platz zu importieren? adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender
52

Wenn Sie faul sind, die Realm-Datenbankdatei jedes Mal mit adb abzurufen, können Sie Ihrem Android-Code eine Exportfunktion hinzufügen, die Ihnen eine E-Mail mit der Realm-Datenbankdatei als Anhang sendet.

Hier ein Beispiel:

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

Vergessen Sie nicht, diese Benutzerberechtigung zu Ihrer Android Manifest-Datei hinzuzufügen:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Ruclip
quelle
3
Dies ist besonders gut, wenn Sie Pushbullet verwenden . Anschließend können Sie eine Nachricht an Ihren Chrome-Browser senden, der die Datei herunterlädt. Die Datei kann dann in Realm Browser
ymerdrengene
1
Absturz auf Android 8.0
EGHDK
42

Für Android (Sie müssen Ihr Gerät nicht rooten)

Um eine Kopie einer Realm-Datenbank auf Ihrem Gerät zu erhalten, rufen Sie den Gerätedateie- Explorer in Android Studio auf.

Navigieren Sie zu /data/data/your.package.name/files/.

Dort finden Sie Ihre * .realm-Dateien. Klicken Sie mit der rechten Maustaste und dann auf Speichern unter . Stellen Sie sicher, dass Sie synchronisieren, bevor Sie sie speichern.

Verwenden Sie Realm Browser oder einen dieser Browser , um * .realm-Dateien anzuzeigen:

Geben Sie hier die Bildbeschreibung ein

krhitesh
quelle
2
Solch eine einfache Lösung, dies sollte nun die Antwort sein
Steven Elliott
Absolut. Das ist der Weg. 🙏
Nolan Amy
Stellen Sie sicher, dass Ihre App auf debuggable false eingestellt ist, um die Daten anzuzeigen.
Aman Verma
@AmanVerma Es ist USB-Debugging in den Entwickleroptionen. USB-Debugging muss aktiviert sein, um Device File Explorer
krhitesh
Linux-Benutzer können Realm Studio mit Realm.io/products/realm-studio herunterladen und die Realm-Datei von dort aus öffnen
B.shruti
19

Es gibt eine Problemumgehung. Sie können direkt vom Gerätemonitor aus auf die Datei zugreifen. Sie können nur dann auf dieses Verzeichnis zugreifen, wenn Sie einen Emulator oder ein gerootetes Gerät verwenden.

In Android Studio:

Wählen

Menü ExtrasAndroidAndroid-GerätemonitorDatei-ExplorerDatenDaten → (Ihr Paketname ) → Dateien → * db.realm

Ziehen Sie diese Datei vom Gerät:

Geben Sie hier die Bildbeschreibung ein

Ab Android Studio 3 Canary 1 wurde der Device File Explorer eingeführt. Sie müssen die Realm-Datei hier ansehen. Dann (wählen Sie Ihr Paket aus) → wählen Sie die Realm-Datei aus → Klicken Sie mit der rechten Maustaste und speichern Sie sie.

Geben Sie hier die Bildbeschreibung ein

Und öffnen Sie die Datei im Realm Browser. Sie können Ihre Daten jetzt sehen.

Aveek
quelle
Vielen Dank. Es funktioniert jedoch nicht mit echten Geräten. Es funktioniert nur mit Emulator
Pratham Kesarkar
1
@prathamkesarkar, deshalb habe ich einen Emulator oder ein gerootetes Gerät geschrieben, weil Sie auf einem normalen Gerät keinen Zugriff auf diese Ordner erhalten.
Aveek
14

Sie können direkt auf die Realm-Datei zugreifen. Hier ist eine Lösung, die ich verwendet habe.

Zuerst können Sie die Realm-Datei, die sich in '/ data / data / packagename / files' befindet, nach Environment.getExternalStorageDirectory () + '/ FileName.realm' kopieren:

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

Verwenden Sie zweitens das ADB-Tool, um diese Datei wie folgt abzurufen:

$ adb pull /sdcard/default.realm.

Jetzt können Sie die Datei im Realm Browser öffnen.

Rooney
quelle
6

Hier ist eine Lösung, bei der Ihr Telefon nicht gerootet werden muss, indem Sie den run-asBefehl in adbder Shell verwenden. Einzige Voraussetzung ist, dass Sie einen Debug-Build Ihrer App auf dem Zieltelefon installiert haben.

$ 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

Sie haben eine Kopie der Datenbank von jedem Telefon in Ihrem lokalen Verzeichnis, die Sie dann in den Realm Browser laden können.

Pedro Alvarez-Tabio
quelle
1
mac adb Standardpfad ... / Bibliothek / Android / sdk / Plattform-Tools
Francisco Castro
3

Sie können jetzt direkt darauf zugreifen, wenn Sie einen Emulator verwenden.

Erste Log der Pfad , in dem sich die Datei im Emulator ist als @bmunk sagt:

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

Zweitens Suchen Sie es und klicken Sie mit der rechten Maustaste auf die Datei und wählen Sie "Speichern unter". Im Dialogfeld wird die Route angezeigt, auf der sich die Datei tatsächlich in Ihrem System befindet.

Geben Sie hier die Bildbeschreibung ein Sie können die Route aus dem Dialogfeld Speichern unter kopieren

Fügen Sie dann einfach die Route in das Dialogfeld "Lokale Datei öffnen" von Realm Studio ein.

(Ich habe dies nur in Windows getestet)

Brugui
quelle
1
Dies ist die nützlichste Antwort, danke! Zeigt den Pfad für macOS nicht an, aber es ist immer noch einfach, die Datei zu finden.
Maria
1

Hier ist mein gebrauchsfertiges Shell-Skript. Ändern Sie einfach den Paketnamen und Ihre ADB-Pfade, dann erledigt das Skript die erforderlichen Schritte.

#!/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

Weitere Details zu diesem Blog-Beitrag: http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-android/

Mehdi Sakout
quelle
1

Einfach halten:

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

Erläuterung:

  1. Suchen Sie den Pfad zu Ihrer adbInstallation. Wenn Sie Android Studio verwenden, gehen Sie zu Datei> Projektstruktur> SDK-Speicherort> Android SDK-Speicherort und hängen Sie platform-toolsdiesen Pfad an.
  2. Verwenden Sie den vollständig qualifizierten Namen Ihrer App für das run-asArgument
  3. Entscheiden Sie, wohin Sie die Realm-Datei kopieren möchten

NB: Die Datei heißt default.realm, da ich ihren Namen bei der Konfiguration nicht geändert habe - Ihre kann anders sein.

Inti
quelle
1

Sie haben nur wenige Möglichkeiten, um Ihre Android Realm-Dateien anzuzeigen:

  1. Wie @Christian Melchior sagte, können Sie Ihre Realm-Datenbank vom Gerät abrufen und mit dem OSX Realm Browser auf Ihrem Mac öffnen

  2. Sie können den von mir erstellten Android Realm Browser von Drittanbietern verwenden , um die Android-Entwicklung mit Realm ein wenig zu vereinfachen. Die App zeigt Ihnen alle Realm-Dateien auf Ihrem Gerät an und Sie können alle Ihre Realm-Dateien in Echtzeit anzeigen, während Sie Ihre App testen.

  3. Sie können den Chrome-Browser Stetho verwenden. Die vollständige Beschreibung zur Verwendung von Setho finden Sie unter @Jemshit Iskendero answer.

SocialError
quelle
0

Hier ist eine Shell für faule Leute wie mich :)

Die .realmDatei wird im tmpRealm/Ordner neben der .shDatei gespeichert.

#!/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 ./

Oder wenn Sie es vorziehen, tmpRealm/auf der SD-Karte zu sein:

#!/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" ./

Referenz:

  1. https://stackoverflow.com/a/28486297/2603230
  2. https://android.stackexchange.com/a/129665/179720
Er Yifei 何 一 非
quelle