私はRealmを発見し、それをより詳細に探究したいと思ったので、サンプルアプリケーションを作成してそれをめちゃくちゃにすることにしました。ここまでは順調ですね。
しかし、まだ解決できなかったことの1つは、データベースをRealmブラウザで表示する方法です。どうすればこれができますか?
現在Realmブラウザはデバイス上で直接データベースにアクセスすることをサポートしていないので、それを見るためにはエミュレータ/電話からデータベースをコピーする必要があります。これはADBを使用して実行できます。
adb pull /data/data/<packagename>/files/ .
そのコマンドはRealm.getInstance(new RealmConfiguration.Builder().build())
を使って作成されたすべてのRealmファイルを引っ張ります。デフォルトのデータベースはdefault.realm
です。
これはエミュレータ上またはデバイスが根ざしている場合にのみ機能することに注意してください。
毎回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" />
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"
回避策があります。デバイスモニタから直接ファイルにアクセスできます。このディレクトリにアクセスできるのは、エミュレータまたは根ざしたデバイスを使用しているときだけです。
Android Studioの場合:
選択
メニューツール→Android→Androidデバイスモニタ→ファイルエクスプローラ→データ→データ→(あなたのパッケージ名)→ファイル→* db.realm
このファイルをデバイスから取り出します。
Android Studio 3 canary 1から、Device File Explorerが導入されました。ここでレルムファイルを探す必要があります。次に、(パッケージを選択します)→レルムファイルを選択します→右クリックして保存します。
そして、ファイルをRealmブラウザで開きます。あなたは今あなたのデータを見ることができます。
レルムファイルに直接アクセスできます。これが私が使った解決策です。
まず、 '/ 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.
これで、レルムブラウザでファイルを開くことができます。
これは、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ブラウザにロードできます。
これが私のすぐに使えるシェルスクリプトです。パッケージ名と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/
簡単にする:
/Users/inti/Library/Android/sdk/platform-tools/adb exec-out run-as com.mydomain.myapp cat files/default.realm > ~/Downloads/default.realm
説明:
adb
インストールへのパスを見つけます。 Android Studioを使用している場合は、[ファイル]> [プロジェクト構造]> [SDKの場所]> [Android SDKの場所]を確認し、そのパスにplatform-tools
を追加します。run-as
引数には、アプリの完全修飾名を使用してください。注意:このファイルはdefault.realmという名前です。設定時に名前を変更していないからです。
Androidレルムファイルを表示するには、いくつかの選択肢があります。
@Christian Melchiorが言ったように、デバイスからレルムデータベースを取り出して、Mac上で開くことができます OSXレルムブラウザ
あなたはサードパーティを使うことができます Android Realm Browser 私は作成した、レルムを使ったAndroid開発を少し簡単にします。アプリは、デバイス上のすべてのレルムファイルを表示します。また、アプリのテスト中に、すべてのレルムファイルをリアルタイムで表示できます。
Chromeブラウザを使えます Stetho Sethoの使い方の詳細は@Jemshit Iskenderoが提供しています。
これは私のような怠惰な人々のためのシェルです:)
.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" ./
参照: