web-dev-qa-db-ja.com

RealmブラウザでRealmファイルを表示する方法

私はRealmを発見し、それをより詳細に探究したいと思ったので、サンプルアプリケーションを作成してそれをめちゃくちゃにすることにしました。ここまでは順調ですね。

しかし、まだ解決できなかったことの1つは、データベースをRealmブラウザで表示する方法です。どうすればこれができますか?

118
Andy Joyce

現在Realmブラウザはデバイス上で直接データベースにアクセスすることをサポートしていないので、それを見るためにはエミュレータ/電話からデータベースをコピーする必要があります。これはADBを使用して実行できます。

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

そのコマンドはRealm.getInstance(new RealmConfiguration.Builder().build())を使って作成されたすべてのRealmファイルを引っ張ります。デフォルトのデータベースはdefault.realmです。

これはエミュレータ上またはデバイスが根ざしている場合にのみ機能することに注意してください。

123

これで、Facebookで開発された Stetho を使用してChromeブラウザでRealm DBを表示できます。デフォルトでは、StethoはSqlite、ネットワーク、sharedpreferencesを表示することができますが、追加の ここではプラグイン でRealmも表示できます。

アプリの実行中および接続中にApplicationクラスを上記のライブラリで設定した後、Chromeブラウザを開いてchrome://inspectを表示します。


enter image description here

それからResources->Web Sql->default.realm


enter image description here

99

毎回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 Manifestファイルにこのユーザー権限を追加することを忘れないでください:

    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
52
ruclip

ADBシェルとrun-asコマンドを使用して、ファイルをNON以外のデバイスから取得することもできます。

これらのコマンドを使用して、ファイルフォルダーにある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"
52
Apperside

Androidの場合(デバイスをルートにする必要はありません)

お使いのデバイス上のRealmデータベースのコピーを入手するには、Android Studioのデバイスファイルエクスプローラにアクセスしてください。

/data/data/your.package.name/files/に移動します。

そこにあなたの* .realmファイルがあります。右クリックしてから名前を付けて保存します。保存する前に必ず同期してください。

* .realmファイルを表示するには、 レルムブラウザ または これら のいずれかを使用します。

Enter image description here

17
devilsbane

回避策があります。デバイスモニタから直接ファイルにアクセスできます。このディレクトリにアクセスできるのは、エミュレータまたは根ざしたデバイスを使用しているときだけです。

Android Studioの場合:

選択

メニューツールAndroidAndroidデバイスモニタファイルエクスプローラデータデータ→(あなたのパッケージ名)→ファイル→* db.realm

このファイルをデバイスから取り出します。

Enter image description here

Android Studio 3 canary 1から、Device File Explorerが導入されました。ここでレルムファイルを探す必要があります。次に、(パッケージを選択します)→レルムファイルを選択します→右クリックして保存します。

Enter image description here

そして、ファイルをRealmブラウザで開きます。あなたは今あなたのデータを見ることができます。

17
Aveek

レルムファイルに直接アクセスできます。これが私が使った解決策です。

まず、 '/ 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.

これで、レルムブラウザでファイルを開くことができます。

13
Rooney

これは、adbのシェル内に存在するrun-asコマンドを使用することによって、あなたの電話が根付くことを必要としない解決策です。唯一の前提条件は、ターゲットの電話機にあなたのアプリのデバッグビルドをインストールしなければならないということです。

$ 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ブラウザにロードできます。

5

エミュレータを使用している場合は、これで直接アクセスできます。

最初@bmunkのように、ファイルがエミュレータ内にあるパスを記録します。

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

2番目検索してファイルを右クリックして[名前を付けて保存]を選択すると、ファイルが実際にシステム内にあるルートが表示されます。 。

enter image description hereYou can copy the route from the Save As dialog

そして、そのルートをRealm Studioの[Open Local File]ダイアログに貼り付けるだけです。

(私はこれをWindowsでのみテストしました)

2
Brugui

これが私のすぐに使えるシェルスクリプトです。パッケージ名と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
Mehdi

簡単にする:

/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
Inti

Androidレルムファイルを表示するには、いくつかの選択肢があります。

  1. @Christian Melchiorが言ったように、デバイスからレルムデータベースを取り出して、Mac上で開くことができます OSXレルムブラウザ

  2. あなたはサードパーティを使うことができます Android Realm Browser 私は作成した、レルムを使ったAndroid開発を少し簡単にします。アプリは、デバイス上のすべてのレルムファイルを表示します。また、アプリのテスト中に、すべてのレルムファイルをリアルタイムで表示できます。

  3. Chromeブラウザを使えます Stetho Sethoの使い方の詳細は@Jemshit Iskenderoが提供しています。

1
SocialError

これは私のような怠惰な人々のためのシェルです:)

.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/26032
  2. https://Android.stackexchange.com/a/129665/17972
0