¿Cómo veo mi archivo Realm en el navegador Realm?

127

Acabo de descubrir Realm y quería explorarlo con más detalle, así que decidí crear una aplicación de muestra y tener un lío con ella. Hasta aquí todo bien.

Sin embargo, una cosa que aún no he podido resolver es cómo ver mi base de datos en el navegador Realm. ¿Cómo se puede hacer esto?

Andy Joyce
fuente
¿QUIERES EL CAMINO FÁCIL? Omita el registro de ruta, los comandos adb y el dolor de cabeza. @devsmash tiene la respuesta: stackoverflow.com/a/49705298/483520
Nolan Amy

Respuestas:

131

Actualmente, Realm Browser no admite el acceso a bases de datos directamente en el dispositivo, por lo que debe copiar la base de datos del emulador / teléfono para verla. Eso se puede hacer usando ADB:

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

Ese comando extraerá todos los archivos Realm creados con Realm.getInstance(new RealmConfiguration.Builder().build()). Se llama a la base de datos predeterminada default.realm.

Tenga en cuenta que esto solo funcionará en un emulador o si el dispositivo está rooteado.

Christian Melchior
fuente
25
También puede registrar la ruta exacta desde su aplicación con: Log.d ("", "ruta:" + realm.getPath ());
bmunk
39
Entonces Realm Browser para Mac es inútil. Quién usa el emulador
Jemshit Iskenderov
10
Para dispositivos no rooteados, este script funciona: gist.github.com/jk2K/a66ed67b252b880824b32dd4952d1b39
jmartinalonso
3
si obtiene un error como archivo no encontrado, ejecute el comando raíz adb primero antes de extraer el archivo de dominio.
randy
Esto funciona después de usar la raíz adb, pero no importa lo que haga, el archivo de dominio dice que está encriptado cuando se usa el navegador de dominio. Sí, leí sobre corrupción y tal, pero nada de lo que intento funciona en absoluto. ¿Ha cambiado algo en el reino?
Mike Axle
104

Ahora puede ver Realm DB en el navegador Chrome con Stetho , desarrollado por Facebook. De manera predeterminada, Stetho permite ver Sqlite, red, preferencias compartidas, pero con un complemento adicional aquí también permite ver Realm.

Después de configurar su Applicationclase con las bibliotecas anteriores, mientras la aplicación se está ejecutando y conectada, abra el navegador Chrome y navegue chrome://inspectpara ver


ingrese la descripción de la imagen aquí

Luego Resources->Web Sql->default.realm


ingrese la descripción de la imagen aquí

Jemshit Iskenderov
fuente
2
Error al resolver: com.uphyca: stetho_realm: 0.8.0 ¿Alguien puede ayudarme con esto? Lo siento, no soy un usuario de Mac, por lo que parece que de esta manera es lo único que puedo examinar mi archivo de base de datos.
cuidadoso7j
44
¿ Agregaste la URL https://github.com/uPhyca/stetho-realm/raw/master/maven-repocomo se muestra aquí github.com/uPhyca/stetho-realm
Jemshit Iskenderov
2
Mi culpa, muchas gracias! He extrañado esto. ¡Ahora funciona como debería!
cuidadoso7j
1
Miro los cambios de la tabla "A" haciendo clic en otra tabla y luego haciendo clic en la tabla "A" nuevamente @AlexKost
Jemshit Iskenderov
1
vea esta publicación si alguien tiene problemas para ver los campos: github.com/uPhyca/stetho-realm/issues/45 ... Veo mis campos pero no hay datos ... hmmm
Mike6679
56

También puede extraer su archivo desde cualquier dispositivo NO rooteado utilizando el shell ADB y el comando run-as.

Puede usar estos comandos para extraer del almacenamiento privado de su aplicación una base de datos llamada your_database_file_name ubicada en la carpeta de archivos:

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
fuente
3
Convenido. Como podemos configurar la aplicación para que se pueda depurar, podemos extraer el archivo con esto sin root.
JoshuaTree
¿Hay alguna otra forma de extraer la base de datos de apk no depurable?
JEGADEESAN S
si eso fuera posible, todo el sistema operativo Android sería completamente inseguro, existe la posibilidad de que solo sea posible en dispositivos rooteados, pero nunca lo hice
Apperside
Es posible que esto no funcione en dispositivos Samsung debido a sus implementaciones con errores de ejecución.
SkorpEN
Entonces, ¿podemos usar esto para importar nuestro reino editado a su lugar? adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender
52

Si eres perezoso para obtener el archivo de base de datos del reino cada vez con adb, puedes agregar una función de exportación a tu código de Android, que te envía un correo electrónico con el archivo de la base de datos del reino como archivo adjunto.

Aquí un ejemplo:

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

No olvide agregar este permiso de usuario a su archivo de manifiesto de Android:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
ruclip
fuente
3
Esto es especialmente bueno si usa Pushbullet . Luego puede enviar un mensaje a su navegador Chrome y descargará el archivo. El archivo se puede abrir en Realm Browser
ymerdrengene
1
Fallo en Android 8.0
EGHDK
42

Para Android (no es necesario rootear su dispositivo)

Para obtener una copia de cualquiera de las bases de datos de Realm en su dispositivo, vaya a Device File Explorer en Android Studio.

Navega hasta /data/data/your.package.name/files/.

Allí encontrará sus archivos * .realm. Haga clic derecho, luego Guardar como . Asegúrese de sincronizar antes de guardarlos.

Use Realm Browser o cualquiera de estos para ver archivos * .realm:

Ingrese la descripción de la imagen aquí

krhitesh
fuente
2
Una solución tan simple, esta debería ser la respuesta
Steven Elliott
Absolutamente. Esta es la forma. 🙏
Nolan Amy
Asegúrese de que su aplicación esté configurada como falsa depurable para ver los datos.
Aman Verma
@AmanVerma Es la depuración de USB en las Opciones de desarrollador. La depuración de USB debe estar habilitada para usar Device File Explorer
krhitesh
El usuario de Linux puede descargar realm studio usando realm.io/products/realm-studio y abrir el archivo de reino desde allí
B.shruti
19

Hay una solución alternativa. Puede acceder directamente al archivo desde el monitor del dispositivo. Puede acceder a este directorio solo cuando está utilizando un emulador o dispositivo rooteado.

En Android Studio:

Seleccione

Herramientas de menú → AndroidMonitor de dispositivo AndroidExplorador de archivosdatosdatos → (Nombre del paquete) → archivos → * db.realm

Extraiga este archivo del dispositivo:

Ingrese la descripción de la imagen aquí

Desde Android Studio 3 canary 1, se ha introducido Device File Explorer. Necesitas mirar el archivo del reino aquí. Luego, (seleccione su paquete) → seleccione el archivo de reino → Haga clic derecho y guarde.

Ingrese la descripción de la imagen aquí

Y abra el archivo en el navegador Realm. Puedes ver tus datos ahora.

Aveek
fuente
Gracias. sin embargo, no funciona con un dispositivo real. Solo funciona con Emulator
pratham kesarkar
1
@prathamkesarkar, es por eso que escribí un emulador o un dispositivo rooteado porque no puedes acceder a estas carpetas en un dispositivo normal.
Aveek
14

Puede acceder al archivo de reino directamente. Aquí hay una solución que he usado.

Primero puede copiar el archivo de dominio que se encuentra en '/ data / data / packagename / files' en 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();
}

En segundo lugar, use la herramienta ADB para extraer ese archivo de esta manera:

$ adb pull /sdcard/default.realm.

Ahora puede abrir el archivo en el navegador Realm.

Rooney
fuente
6

Aquí hay una solución que no requiere que su teléfono esté rooteado, haciendo uso del run-ascomando presente dentro adbdel shell. La única condición previa es que debe tener una versión de depuración de su aplicación instalada en el teléfono de destino.

$ 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

Tendrá una copia de la base de datos desde cualquier teléfono dentro de su directorio local, que luego puede cargar en el navegador Realm.

Pedro Alvarez-Tabio
fuente
1
ruta predeterminada de mac adb ... / Library / Android / sdk / platform-tools
Francisco Castro
3

Ahora puede acceder directamente si está utilizando un emulador.

Primero, registre la ruta donde está el archivo en el emulador como @bmunk dice:

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

Segundo búscalo y haz clic derecho en el archivo y elige "Guardar como", en el cuadro de diálogo aparecerá la ruta donde realmente está el archivo en tu sistema.

ingrese la descripción de la imagen aquí Puede copiar la ruta desde el cuadro de diálogo Guardar como

Y luego, simplemente pegue la ruta en el cuadro de diálogo "Abrir archivo local" de Realm Studio.

(He probado esto solo en Windows)

Brugui
fuente
1
Esta es la respuesta más útil, ¡gracias! No muestra la ruta para macOS, pero aún así es fácil localizar el archivo.
Maria
1

Aquí está mi script de shell listo para usar. Simplemente cambie el nombre del paquete y sus rutas adb, luego el script hará lo necesario.

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

Más detalles en esta publicación de blog: http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-android/

Mehdi Sakout
fuente
1

Manteniéndolo simple:

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

Explicación:

  1. Encuentre la ruta a su adbinstalación. Si está utilizando Android Studio, mire Archivo> Estructura del proyecto> Ubicación del SDK> Ubicación del SDK de Android y agregue platform-toolsesa ruta.
  2. Use el nombre completo de su aplicación para el run-asargumento
  3. Decide dónde quieres copiar el archivo de reino

NB: el archivo se llama default.realm porque no he cambiado su nombre al configurarlo; el tuyo puede ser diferente.

Inti
fuente
1

Tiene pocas opciones para ver sus archivos de reino de Android:

  1. Como @Christian Melchior dijo que puede extraer su base de datos de dominio del dispositivo y abrirla en su Mac usando OSX Realm Browser

  2. Puede usar el navegador Realm de Android de terceros que creé para hacer que el desarrollo de Android con el reino sea un poco más fácil. La aplicación le mostrará todos los archivos de dominio en su dispositivo, y puede ver todos sus archivos de dominio en tiempo real mientras prueba su aplicación.

  3. Puede usar el navegador Chrome Stetho La descripción completa de cómo usar Setho es proporcionada por la respuesta de @Jemshit Iskendero.

SocialError
fuente
0

Aquí hay una concha para gente perezosa como yo :)

El .realmarchivo se almacenará dentro de la tmpRealm/carpeta al lado del .sharchivo.

#!/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 si prefieres dejar tmpRealm/estar en la tarjeta 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" ./

Referencia:

  1. https://stackoverflow.com/a/28486297/2603230
  2. https://android.stackexchange.com/a/129665/179720
Él Yifei 何 一 非
fuente