Как просмотреть файл Realm в браузере Realm?

127

Я только что открыл для себя Realm и хотел изучить его более подробно, поэтому решил создать образец приложения и повозиться с ним. Все идет нормально.

Однако одна вещь, которую я пока не смог решить, - это как просматривать мою базу данных в Realm Browser. Как это может быть сделано?

Энди Джойс
источник
ХОТИТЕ ЛЕГКИЙ СПОСОБ? Пропустите ведение журнала, команды adb и головную боль. У @devsmash есть ответ: stackoverflow.com/a/49705298/483520
Нолан Эми

Ответы:

131

В настоящее время Realm Browser не поддерживает доступ к базам данных непосредственно на устройстве, поэтому вам необходимо скопировать базу данных с эмулятора / телефона, чтобы просмотреть ее. Это можно сделать с помощью ADB:

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

Эта команда извлечет все файлы Realm, созданные с использованием Realm.getInstance(new RealmConfiguration.Builder().build()). База данных по умолчанию называется default.realm.

Обратите внимание, что это будет работать только на эмуляторе или если устройство внедрено.

Кристиан Мельхиор
источник
25
Вы также можете записать точный путь из вашего приложения с помощью: Log.d ("", "path:" + realm.getPath ());
bmunk
39
Так что Realm Browser для Mac бесполезен. Кто использует эмулятор
Джемшит Искендеров
10
Для некорневых
jmartinalonso
3
если вы получаете сообщение об ошибке, например, файл не найден, сначала выполните команду adb root, прежде чем вытащить файл области.
Randy
Это работает после использования adb root, но независимо от того, что я делаю, файл области говорит, что он зашифрован при использовании браузера области. Да, я читал о коррупции и тому подобном, но все, что я пробую, вообще не работает. Что-то изменилось в мире?
Майк
104

Теперь вы можете просматривать Realm DB в браузере Chrome с помощью Stetho , разработанного Facebook. По умолчанию Stetho позволяет просматривать Sqlite, сеть, общие настройки, но с дополнительным плагином здесь можно также просматривать Realm.

После настройки вашего Applicationкласса с помощью вышеуказанных библиотек, пока приложение работает и подключено, откройте браузер Chrome и перейдите, chrome://inspectчтобы увидеть


введите описание изображения здесь

затем Resources->Web Sql->default.realm


введите описание изображения здесь

Джемшит Искендеров
источник
2
Не удалось разрешить: com.uphyca: stetho_realm: 0.8.0 Кто-нибудь может мне с этим помочь? Извините, я не являюсь пользователем Mac, поэтому похоже, что это единственный способ просмотреть файл моей базы данных.
caution7j
4
Вы добавили URL-адрес, https://github.com/uPhyca/stetho-realm/raw/master/maven-repoкак показано здесь github.com/uPhyca/stetho-realm
Джемшит Искендеров
2
Моя вина, большое вам спасибо! Я пропустил это. Теперь работает как надо!
caution7j
1
Я наблюдаю за изменениями в таблице «A», щелкнув другую таблицу, а затем снова щелкнув таблицу «A» @AlexKost
Джемшит Искендеров
1
см. этот пост, если у кого-то есть проблемы с отображением полей: github.com/uPhyca/stetho-realm/issues/45 .... Я вижу свои поля, но нет данных ....
хммм
56

Вы также можете вытащить свой файл с любого устройства, не имеющего корневого доступа, с помощью оболочки ADB и команды run-as.

Вы можете использовать эти команды, чтобы извлечь из личного хранилища вашего приложения базу данных с именем your_database_file_name, расположенную в папке с файлами:

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
источник
3
Согласовано. Поскольку мы можем настроить приложение как отлаживаемое, мы можем вытащить файл с этим без root.
JoshuaTree
есть ли другой способ вытащить базу данных из не отлаживаемого apk?
JEGADEESAN S
если бы это было возможно, вся ОС Android была бы совершенно небезопасной. Есть шанс, что это возможно только на устройствах с
root-доступом
Это может не работать на устройствах Samsung из-за их ошибочной реализации.
SkorpEN
Итак, мы можем использовать это, чтобы импортировать нашу отредактированную область обратно на свое место? adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Эндер
52

Если вам лень каждый раз получать файл базы данных области с помощью adb, вы можете добавить функцию экспорта в свой код Android, которая отправит вам электронное письмо с файлом базы данных области в качестве вложения.

Вот пример:

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

Не забудьте добавить это разрешение пользователя в свой файл манифеста Android:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
ruclip
источник
3
Это особенно хорошо, если вы используете Pushbullet . Затем вы можете отправить сообщение в браузер Chrome, и он загрузит файл. Затем файл можно открыть в браузере Realm
ymerdrengene
1
Сбой на Android 8.0
EGHDK
42

Для Android (рутировать устройство не нужно)

Чтобы получить копию любой базы данных Realm на вашем устройстве, перейдите в Проводник файлов устройства в Android Studio.

Перейдите к /data/data/your.package.name/files/.

Там вы найдете свои файлы * .realm. Щелкните правой кнопкой мыши, затем " Сохранить как" . Обязательно синхронизируйте их, прежде чем сохранять.

Используйте Realm Browser или любой из них для просмотра файлов * .realm:

Введите описание изображения здесь

krhitesh
источник
2
Такое простое решение, теперь это должно быть ответом
Стивен Эллиотт
Абсолютно. Это способ. 🙏
Нолан Эми
Убедитесь, что для вашего приложения установлено значение «ложь для отладки», чтобы просматривать данные.
Аман Верма
@AmanVerma Это отладка по USB в параметрах разработчика. Для использования проводника файлов устройства необходимо включить отладку по USB
krhitesh
Пользователь Linux может загрузить Realm Studio с помощью realm.io/products/realm-studio и открыть оттуда файл realm
Б.Шрути,
19

Есть обходной путь. Вы можете получить прямой доступ к файлу с монитора устройства. Вы можете получить доступ к этому каталогу только при использовании эмулятора или рутированного устройства.

В Android Studio:

Выбрать

Меню ИнструментыAndroidAndroid Device MonitorПроводникданныеданные → (Имя вашего пакета) → файлы → * db.realm

Вытащите этот файл с устройства:

Введите описание изображения здесь

Из Android Studio 3 canary 1 был представлен проводник файлов устройства. Вам нужно посмотреть файл области здесь. Затем (выберите свой пакет) → выберите файл области → щелкните правой кнопкой мыши и сохраните.

Введите описание изображения здесь

И откройте файл в Realm Browser. Теперь вы можете увидеть свои данные.

Aveek
источник
Спасибо. однако он не работает с реальным устройством. Он работает только с эмулятором
pratham kesarkar
1
@prathamkesarkar, поэтому я написал эмулятор или рутированное устройство, потому что вы не можете получить доступ к этим папкам на обычном устройстве.
Aveek
14

Вы можете получить доступ к файлу области напрямую. Вот решение, которое я использовал.

Сначала вы можете скопировать файл области, который находится в '/ data / data / packagename / files', в 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();
}

Во-вторых, используйте инструмент ADB, чтобы вытащить этот файл следующим образом:

$ adb pull /sdcard/default.realm.

Теперь вы можете открыть файл в Realm Browser.

Руни
источник
6

Вот решение, которое не требует, чтобы ваш телефон был рутирован, с помощью run-asкоманды, присутствующей внутри adbоболочки. Единственным условием является то, что на целевом телефоне должна быть установлена ​​отладочная сборка вашего приложения.

$ 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

У вас будет копия БД с любого телефона в вашем локальном каталоге, которую вы затем сможете загрузить в Realm Browser.

Педро Альварес-Табио
источник
1
mac adb default path ... / Library / Android / sdk / platform-tools
Франсиско Кастро
3

Теперь вы можете получить к нему доступ напрямую, если используете эмулятор.

Сначала зарегистрируйте путь, по которому файл находится в эмуляторе, как говорит @bmunk:

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

Во-вторых, выполните поиск и щелкните правой кнопкой мыши файл и выберите «Сохранить как», в диалоговом окне появится маршрут, по которому файл действительно находится в вашей системе.

введите описание изображения здесь Вы можете скопировать маршрут из диалогового окна «Сохранить как».

А затем просто вставьте маршрут в диалоговое окно «Открыть локальный файл» Realm Studio.

(Я тестировал это только в Windows)

Brugui
источник
1
Это самый полезный ответ, спасибо! Не показывает путь для macOS, но найти файл по-прежнему легко.
Мария
1

Вот мой готовый к использованию сценарий оболочки. Просто измените имя пакета и ваши пути adb, и скрипт сделает все необходимое.

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

Подробнее об этом сообщении в блоге: http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-android/

Мехди Сакут
источник
1

Все просто:

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

Объяснение:

  1. Найдите путь к вашей adbустановке. Если вы используете Android Studio, посмотрите Файл> Структура проекта> Расположение SDK> Расположение Android SDK и добавьте platform-toolsк этому пути.
  2. Используйте полное имя вашего приложения для run-as аргумента
  3. Решите, куда вы хотите скопировать файл области.

NB: файл называется default.realm, потому что я не менял его имя при настройке - ваше может быть другим.

Инти
источник
1

У вас есть несколько вариантов просмотра файлов области Android:

  1. Как сказал @Christian Melchior, вы можете вытащить свою базу данных Realm с устройства и открыть ее на своем Mac с помощью OSX Realm Browser

  2. Вы можете использовать сторонний браузер Android Realm, созданный мной, чтобы немного упростить разработку Android с помощью Realm . Приложение покажет вам все файлы области на вашем устройстве, и вы сможете просматривать все файлы области в реальном времени во время тестирования приложения.

  3. Вы можете использовать браузер Chrome Stetho. Полное описание того, как использовать Setho, предоставлено @Jemshit Iskendero.

SocialError
источник
0

Вот оболочка для ленивых вроде меня :)

.realmФайл будет храниться внутри tmpRealm/папки рядом с .shфайлом.

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

Или, если вы предпочитаете оставить tmpRealm/на 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" ./

Ссылка:

  1. https://stackoverflow.com/a/28486297/2603230
  2. https://android.stackexchange.com/a/129665/179720
Хэ Ифэй 何 一 非
источник