Come posso visualizzare il mio file Realm nel Realm Browser?


127

Ho appena scoperto Realm e volevo esplorarlo in modo più dettagliato, quindi ho deciso di creare un'applicazione di esempio e avere un pasticcio con essa. Fin qui tutto bene.

Tuttavia, una cosa che non sono ancora riuscito a capire è come visualizzare il mio database nel Realm Browser. Come si può fare?


VUOI IL MODO FACILE? Salta la registrazione del percorso, i comandi adb e il mal di testa. @devsmash ha la risposta: stackoverflow.com/a/49705298/483520
Nolan Amy,

Risposte:


131

Attualmente Realm Browser non supporta l'accesso ai database direttamente sul dispositivo, quindi è necessario copiare il database dall'emulatore / telefono per visualizzarlo. Questo può essere fatto usando ADB:

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

Tale comando estrarrà tutti i file Realm creati utilizzando Realm.getInstance(new RealmConfiguration.Builder().build()). Viene chiamato il database predefinito default.realm.

Nota che funzionerà solo su un emulatore o se il dispositivo è rootato.


25
Puoi anche registrare il percorso esatto dalla tua app con: Log.d ("", "path:" + realm.getPath ());
bmunk,

39
Quindi Realm Browser per Mac è inutile. Chi usa l'emulatore
Jemshit Iskenderov,

10
Per i dispositivi non rootati questo script funziona: gist.github.com/jk2K/a66ed67b252b880824b32dd4952d1b39
jmartinalonso

3
se ricevi un errore come il file non trovato, esegui il comando adb root prima di estrarre il file realm.
randy

Funziona dopo aver utilizzato adb root ma, indipendentemente da ciò che faccio, il file realm dice che è crittografato quando si utilizza realm browssr. Sì, ho letto della corruzione e cose del genere, ma nulla di ciò che provo funziona. Qualcosa è cambiato nel regno?
Mike Axle,

104

Ora puoi visualizzare Realm DB sul browser Chrome utilizzando Stetho , sviluppato da Facebook. Per impostazione predefinita, Stetho consente di visualizzare Sqlite, rete, preferenze condivise, ma con plug-in aggiuntivo qui consente di visualizzare anche Realm.

Dopo aver configurato la tua Applicationclasse con le librerie sopra, mentre l'app è in esecuzione e connessa, apri il browser Chrome e naviga chrome://inspectper vedere


inserisci qui la descrizione dell'immagine

Poi Resources->Web Sql->default.realm


inserisci qui la descrizione dell'immagine


2
Impossibile risolvere: com.uphyca: stetho_realm: 0.8.0 Qualcuno può aiutarmi con questo? Mi dispiace, non sono un utente mac, quindi sembra che in questo modo sia l'unico che posso sfogliare il mio file di database.
attent7j,

4
Hai aggiunto l'URL https://github.com/uPhyca/stetho-realm/raw/master/maven-repocome mostrato qui github.com/uPhyca/stetho-realm
Jemshit Iskenderov

2
Colpa mia, grazie mille! Mi è mancato questo. Ora funziona come dovrebbe!
attent7j,

1
Osservo le modifiche alla tabella "A" facendo clic su un'altra tabella, quindi facendo nuovamente clic sulla tabella "A" @AlexKost
Jemshit Iskenderov

1
vedi questo post se qualcuno ha problemi con la visualizzazione dei campi: github.com/uPhyca/stetho-realm/issues/45 .... Vedo i miei campi ma non ho dati .... hmmm
Mike6679

56

Puoi anche estrarre il tuo file da qualsiasi dispositivo NON rooted usando la shell ADB e il comando run-as.

Puoi utilizzare questi comandi per estrarre dalla memoria privata della tua app un database chiamato your_database_file_name che si trova nella cartella dei file:

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"

3
Concordato. Poiché possiamo impostare l'applicazione come debuggable, possiamo estrarre il file con questo senza root.
JoshuaTree,

c'è un altro modo per estrarre il database dall'apk non debuggable?
JEGADEESAN S

se ciò fosse possibile, l'intero sistema operativo Android sarebbe completamente pericoloso, c'è una possibilità che potrebbe essere possibile solo su dispositivi rooted, ma non l'ho mai fatto
Apperside

Questo potrebbe non funzionare sui dispositivi Samsung a causa delle loro implementazioni errate.
SkorpEN,

Quindi, possiamo usarlo per importare il nostro regno modificato al suo posto? adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender,

52

Se sei pigro per ottenere il file del database realm ogni volta con adb, potresti aggiungere una funzione di esportazione al tuo codice Android, che ti invierà un'e-mail con il file del database realm come allegato.

Ecco un esempio:

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

Non dimenticare di aggiungere questa autorizzazione utente al tuo file manifest Android:

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

3
Ciò è particolarmente utile se si utilizza Pushbullet . Quindi puoi inviare un messaggio al tuo browser Chrome e scaricherà il file. Il file può quindi essere aperto in Realm Browser
ymerdrengene il


42

Per Android (non è necessario eseguire il root del dispositivo)

Per ottenere una copia di qualsiasi database Realm sul dispositivo, vai a Esplora file dispositivo in Android Studio.

Vai a /data/data/your.package.name/files/.

Lì troverai i tuoi file * .realm. Fare clic con il tasto destro, quindi Salva con nome . Assicurati di sincronizzare prima di salvarli.

Utilizzare Realm Browser o uno di questi per visualizzare i file * .realm:

Inserisci qui la descrizione dell'immagine


2
Una soluzione così semplice, questa dovrebbe ora essere la risposta
Steven Elliott il

Assolutamente. Questo è il modo. 🙏
Nolan Amy,

Assicurati che l'app sia impostata su falso debuggable per visualizzare i dati.
Aman Verma,

@AmanVerma È il debug USB nelle Opzioni sviluppatore. Il debug USB deve essere abilitato per utilizzare Device File Explorer
krhitesh

L'utente Linux può scaricare realm studio usando realm.io/products/realm-studio e aprire il file realm da lì
B.shruti,

19

C'è una soluzione alternativa. È possibile accedere direttamente al file dal monitor del dispositivo. È possibile accedere a questa directory solo quando si utilizza un emulatore o un dispositivo rooted.

In Android Studio:

Selezionare

Strumenti menu → AndroidMonitor dispositivo AndroidEsplora filedatidati → (Nome pacchetto) → file → * db.realm

Estrai questo file dal dispositivo:

Inserisci qui la descrizione dell'immagine

Da Android Studio 3 canary 1, è stato introdotto Device File Explorer. Devi guardare il file realm qui. Quindi, (selezionare il pacchetto) → selezionare il file realm → Fare clic con il tasto destro e salvare.

Inserisci qui la descrizione dell'immagine

E apri il file nel Realm Browser. Puoi vedere i tuoi dati ora.


Grazie. tuttavia non funziona con un dispositivo reale, ma funziona solo con l'Emulatore
pratham kesarkar il

1
@prathamkesarkar, ecco perché ho scritto l'emulatore o il dispositivo rooted perché non riesci ad accedere a queste cartelle in un dispositivo normale.
Aveek,

14

È possibile accedere direttamente al file realm. Ecco la soluzione che ho usato.

Per prima cosa puoi copiare il file realm che si trova in '/ data / data / nomepacchetto / files' in 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();
}

In secondo luogo, utilizzare lo strumento ADB per estrarre quel file in questo modo:

$ adb pull /sdcard/default.realm.

Ora puoi aprire il file nel Realm Browser.


6

Ecco una soluzione che non richiede il root del tuo telefono, usando il run-ascomando presente all'interno adbdella shell. L'unica condizione preliminare è che sia necessario disporre di una build di debug dell'app installata sul telefono di destinazione.

$ 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

Avrai una copia del DB da qualsiasi telefono all'interno della tua directory locale, che potrai quindi caricare nel Realm Browser.


1
percorso predefinito mac adb ... / Library / Android / sdk / platform-tools
Francisco Castro

3

Ora puoi accedervi direttamente se stai usando un emulatore.

Prima registra il percorso in cui si trova il file nell'emulatore come dice @bmunk:

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

Secondo Cerca e fai clic destro sul file e scegli "Salva con nome", nella finestra di dialogo apparirà il percorso in cui il file si trova davvero nel tuo sistema.

inserisci qui la descrizione dell'immagine È possibile copiare il percorso dalla finestra di dialogo Salva con nome

E quindi, basta incollare il percorso nella finestra di dialogo "Apri file locale" di Realm Studio.

(L'ho provato solo su Windows)


1
Questa è la risposta più utile, grazie! Non mostra il percorso per macOS, ma è comunque facile individuare il file.
Maria

1

Ecco il mio script di shell pronto per l'uso. Basta cambiare il nome del pacchetto e i percorsi degli adb, quindi lo script farà il necessario.

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

Maggiori dettagli su questo post del blog: http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-android/


1

Semplificando:

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

Spiegazione:

  1. Trova il percorso per l' adbinstallazione. Se stai usando Android Studio, guarda File> Struttura del progetto> Posizione SDK> Posizione SDK Android e aggiungi platform-toolsa quel percorso.
  2. Usa il nome completo della tua app per l' run-asargomento
  3. Decidi dove vuoi copiare il file realm

NB: Il file si chiama default.realm perché non ho cambiato il suo nome durante la configurazione, il tuo potrebbe essere diverso.


1

Hai poche opzioni per visualizzare i tuoi file realm Android:

  1. Come @Christian Melchior ha detto che puoi estrarre il tuo database realm dal dispositivo e aprirlo sul tuo mac usando OSX Realm Browser

  2. Puoi utilizzare Android Realm Browser di terze parti che ho creato, per semplificare un po 'lo sviluppo Android con realm. L'app ti mostrerà tutti i file realm sul tuo dispositivo e potrai visualizzare tutti i tuoi file realm in tempo reale durante il test della tua app.

  3. È possibile utilizzare il browser Chrome Stetho Descrizione completa su come utilizzare Setho è fornita dalla risposta Iskendero @Jemshit.


0

Ecco una shell per persone pigre come me :)

Il .realmfile verrà archiviato nella tmpRealm/cartella accanto al .shfile.

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

O se preferisci lasciarti tmpRealm/sulla scheda 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" ./

Riferimento:

  1. https://stackoverflow.com/a/28486297/2603230
  2. https://android.stackexchange.com/a/129665/179720
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.