Realm Browser에서 Realm 파일을 보려면 어떻게합니까?


127

방금 Realm을 발견하고 더 자세히 살펴보고 싶었으므로 샘플 응용 프로그램을 만들고 엉망으로 만들었습니다. 여태까지는 그런대로 잘됐다.

그러나 아직 해결하지 못한 것 중 하나는 Realm Browser에서 데이터베이스를 보는 방법입니다. 이것을 어떻게 할 수 있습니까?


쉬운 길을 원하십니까? 경로 로깅, adb 명령 및 두통을 건너 뜁니다. @devsmash가 답을 가지고 있습니다 : stackoverflow.com/a/49705298/483520
Nolan Amy

답변:


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
따라서 Mac 용 Realm Browser는 쓸모가 없습니다. 누가 에뮬레이터를 사용
Jemshit Iskenderov에게

10
비 뿌리 장치의 경우이 스크립트가 작동합니다 gist.github.com/jk2K/a66ed67b252b880824b32dd4952d1b39
jmartinalonso

3
file not found 같은 오류가 발생하면 영역 파일을 가져 오기 전에 먼저 adb root 명령을 실행하십시오.
randy

이것은 adb root를 사용한 후에 작동하지만 내가 무엇을하든 영역 파일은 영역 브라우저를 사용할 때 암호화되어 있다고 말합니다. 예, 부패에 대해 읽었지만 전혀 시도하지 않습니다. 영역에 어떤 변화가 있었습니까?
Mike Axle

104

이제 Facebook에서 개발 한 Stetho를 사용하여 Chrome 브라우저에서 Realm DB를 볼 수 있습니다 . 기본적으로 Stetho에서는 Sqlite, 네트워크, 공유 환경 설정 을 볼 수 있지만 추가 플러그인을 사용하면 Realm도 볼 수 있습니다.

당신 구성한 후 Application응용 프로그램이 열려 크롬 브라우저와 탐색을 실행하고 연결되어있는 동안 것은, 위의 라이브러리와 클래스를 chrome://inspect보고


여기에 이미지 설명을 입력하십시오

그때 Resources->Web Sql->default.realm


여기에 이미지 설명을 입력하십시오


2
해결하지 못했습니다 : com.uphyca : stetho_realm : 0.8.0 누군가 나를 도와 줄 수 있습니까? 죄송합니다. Mac 사용자가 아니므로이 방법으로 데이터베이스 파일을 찾아 볼 수 있습니다.
조심 7 j

4
https://github.com/uPhyca/stetho-realm/raw/master/maven-repo여기에 표시된대로 URL을 추가 했습니까? github.com/uPhyca/stetho-realm
Jemshit Iskenderov

2
내 잘못, 대단히 감사합니다! 나는 이것을 놓쳤다. 이제는 제대로 작동합니다!
조심 7 j

1
다른 테이블을 클릭 한 다음 테이블 "A"를 다시 클릭하여 테이블 "A"의 변경 사항을 확인합니다. @AlexKost
Jemshit Iskenderov

1
사람이보고 필드에 문제가있는 경우 해당 게시물을 참조하십시오 github.com/uPhyca/stetho-realm/issues/45가 .... 내가 흠 .... 내 필드하지만 데이터를 볼
Mike6679

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"

3
동의했다. 응용 프로그램을 디버깅 가능으로 설정할 수 있으므로 루트없이 파일을 가져올 수 있습니다.
JoshuaTree

논박 할 수없는 APK에서 데이터베이스를 가져 오는 다른 방법이 있습니까?
JEGADEESAN S

그것이 가능하다면, 전체 안드로이드 OS는 완전히 안전하지 않을 것입니다. 루팅 된 기기에서만 가능할 가능성이 있지만, 절대하지 않았습니다
Apperside

버그가있는 Run-as 구현으로 인해 Samsung 장치에서는 작동하지 않을 수 있습니다.
SkorpEN

이를 사용하여 편집 한 영역을 원래 위치로 다시 가져올 수 있습니까? adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender

52

adb를 사용하여 영역 데이터베이스 파일을 가져올 때마다 게으른 경우 내보내기 기능을 안드로이드 코드에 추가하면 영역 데이터베이스 파일이 첨부 파일로 포함 된 전자 메일을 보낼 수 있습니다.

예를 들면 다음과 같습니다.

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 Manifest 파일에 추가하는 것을 잊지 마십시오.

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

3
Pushbullet 을 사용하는 경우에 특히 좋습니다 . 그런 다음 메시지를 Chrome 브라우저로 푸시하면 파일이 다운로드됩니다. 파일은 Realm Browser에서 열 수 있습니다
ymerdrengene

1
안드로이드 8.0에서 충돌
EGHDK

42

Android의 경우 (기기를 루팅 할 필요 없음)

장치에서 Realm 데이터베이스의 사본을 얻으려면 Android Studio의 장치 파일 탐색기 로 이동하십시오 .

로 이동하십시오 /data/data/your.package.name/files/.

거기서 * .realm 파일을 찾을 수 있습니다. 마우스 오른쪽 단추를 클릭 한 다음 다른 이름으로 저장을 클릭 하십시오 . 저장하기 전에 반드시 동기화하십시오.

* .realm 파일을 보려면 Realm Browser 또는 이들 중 하나를 사용하십시오 :

여기에 이미지 설명을 입력하십시오


2
이러한 간단한 해결책은 이제 답이 될 것입니다.
Steven Elliott

물론. 이게 방법이야. 🙏
놀란 에이미

데이터를 보려면 앱이 디버깅 가능한 false로 설정되어 있는지 확인하십시오.
Aman Verma

@AmanVerma 개발자 옵션의 USB 디버깅입니다. 장치 파일 탐색기를 사용하려면 USB 디버깅이 활성화되어 있어야합니다
krhitesh

Linux 사용자는 realm.io/products/realm-studio를 사용하여 realm studio를 다운로드 하고 거기에서 realm 파일을 열 수 있습니다
B.shruti

19

해결 방법이 있습니다. 장치 모니터에서 파일에 직접 액세스 할 수 있습니다. 에뮬레이터 또는 루팅 된 장치를 사용하는 경우에만이 디렉토리에 액세스 할 수 있습니다.

Android Studio에서 :

고르다

메뉴 도구AndroidAndroid 장치 모니터파일 탐색기데이터데이터 → (귀하의 패키지 이름) → 파일 → * db.realm

장치에서이 파일을 가져옵니다.

여기에 이미지 설명을 입력하십시오

Android Studio 3 카나리아 1부터 장치 파일 탐색기가 도입되었습니다. 여기서 영역 파일을 찾아야합니다. 그런 다음 (패키지를 선택하십시오) → 영역 파일을 선택하십시오 → 마우스 오른쪽 버튼을 클릭하고 저장하십시오.

여기에 이미지 설명을 입력하십시오

Realm Browser에서 파일을 엽니 다. 이제 데이터를 볼 수 있습니다.


감사. 그러나 실제 장치에서는 작동하지 않습니다. 에뮬레이터에서만 작동합니다
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

로컬 디렉토리 내부의 모든 전화에서 DB 사본을 가져 와서 Realm Browser에로드 할 수 있습니다.


1
mac adb 기본 경로 ... / Library / Android / sdk / platform-tools
Francisco Castro

3

에뮬레이터를 사용하는 경우 직접 액세스 할 수 있습니다.

먼저 @bmunk가 말하는 것처럼 파일이 에뮬레이터에있는 경로를 기록하십시오.

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

두 번째로 파일을 검색하고 파일을 마우스 오른쪽 버튼으로 클릭하고 "다른 이름으로 저장"을 선택하면 대화 상자에 파일이 실제로 시스템에있는 경로가 나타납니다.

여기에 이미지 설명을 입력하십시오 다른 이름으로 저장 대화 상자에서 경로를 복사 할 수 있습니다

그런 다음 Realm Studio의 "로컬 파일 열기"대화창에 경로를 붙여 넣으십시오.

(이것은 Windows에서만 테스트했습니다)


1
가장 유용한 답변입니다. 감사합니다. macOS의 경로는 표시하지 않지만 파일을 쉽게 찾을 수 있습니다.
Maria

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. 영역 파일을 복사 할 위치를 결정하십시오.

주의 : 파일을 구성 할 때 이름을 변경하지 않았기 때문에 파일의 이름이 default.realm입니다. 파일 이름이 다를 수 있습니다.


1

안드로이드 영역 파일을 볼 수있는 옵션이 거의 없습니다 :

  1. @Christian Melchior는 OSX Realm Browser를 사용하여 장치에서 영역 데이터베이스를 가져 와서 Mac에서 열 수 있다고 말했습니다.

  2. 내가 만든 타사 Android Realm Browser 를 사용하여 안드로이드 개발을 좀 더 쉽게 할 수 있습니다. 앱은 장치의 모든 영역 파일을 표시하며 앱을 테스트하는 동안 모든 영역 파일을 실시간으로 볼 수 있습니다.

  3. Chrome 브라우저를 사용할 수 있습니다 Stetho 자세한 설명 Setho 를 사용하는 방법은 @Jemshit Iskendero answer에서 제공합니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.