Answers:
当前,领域浏览器不支持直接在设备上访问数据库,因此您需要从仿真器/电话复制数据库以进行查看。这可以通过使用ADB来完成:
adb pull /data/data/<packagename>/files/ .
该命令将拉出使用创建的所有Realm文件Realm.getInstance(new RealmConfiguration.Builder().build())
。默认数据库称为default.realm
。
请注意,这仅适用于仿真器或设备已植根。
现在,您可以使用Facebook开发的Stetho在Chrome浏览器上查看Realm DB 。默认情况下,Stetho允许查看Sqlite,网络,共享首选项,但此处带有其他插件也允许查看Realm。
Application
使用上述库配置完班级后,在应用程序运行和连接的情况下,打开Chrome浏览器并导航chrome://inspect
以查看
然后 Resources->Web Sql->default.realm
https://github.com/uPhyca/stetho-realm/raw/master/maven-repo
如下所示的网址github.com/uPhyca/stetho-realm
您还可以使用ADB Shell和run-as命令从任何非根目录设备中提取文件。
您可以使用以下命令从应用程序的专用存储中拉出位于files文件夹中的名为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"
adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
如果您不愿意每次都使用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" />
要获取设备上任何Realm数据库的副本,请转到Android Studio中的设备文件资源管理器。
导航至/data/data/your.package.name/files/
。
在这里,您将找到* .realm文件。右键单击,然后单击另存为。保存它们之前,请确保进行同步。
有一种解决方法。您可以直接从设备监视器访问文件。仅当您使用仿真器或有根设备时,您才能访问此目录。
在Android Studio中:
选择
菜单工具 → Android → Android设备监视器 → 文件资源管理器 → 数据 → 数据 →(您的包名称)→ 文件 →* db.realm
从设备中提取此文件:
从Android Studio 3金丝雀1开始,引入了设备文件资源管理器。您需要在这里查看领域文件。然后,(选择您的软件包)→选择领域文件→右键单击并保存。
并在Realm Browser中打开文件。您现在可以查看数据。
您可以直接访问领域文件。这是我使用过的解决方案。
首先,您可以将位于“ / 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。
现在,您可以在“领域浏览器”中打开文件。
通过使用外壳程序中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
您将从本地目录中的任何电话获得数据库的副本,然后可以将其加载到领域浏览器中。
这是我现成的shell脚本。只需更改软件包名称和您的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所说的那样,您可以从设备中提取领域数据库,并使用OSX Realm Browser在Mac上打开它
您可以使用我创建的第三方Android Realm Browser,使具有领域的android开发变得更加容易。应用程序将向您显示设备上的所有领域文件,并且您可以在测试应用程序时实时查看所有领域文件。
您可以使用Chrome浏览器Stetho由@Jemshit Iskendero提供的完整说明如何使用Setho。
这是像我这样的懒人的外壳:)
该.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" ./
参考: