如何在 Realm 浏览器中查看我的 Realm 文件?

IT小君   2021-09-30T02:02:04

我刚刚发现了 Realm 并想更详细地探索它,所以我决定创建示例应用程序并把它弄得一团糟。到现在为止还挺好。

但是,我还无法解决的一件事是如何在领域浏览器中查看我的数据库。如何才能做到这一点?

评论(15)
IT小君

目前 Realm 浏览器不支持直接在设备上访问数据库,因此您需要从模拟器/手机复制数据库才能查看。这可以通过使用 ADB 来完成:

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

该命令将拉取所有使用Realm.getInstance(new RealmConfiguration.Builder().build()). 默认数据库称为default.realm.

请注意,这仅适用于模拟器或设备已植根。

2021-09-30T02:02:04   回复
IT小君

现在您可以使用Facebook 开发的Stetho在 Chrome 浏览器上查看 Realm DB 默认情况下,Stetho 允许查看 Sqlite、网络、共享首选项,但通过附加插件也可以查看 Realm。

Application使用上述库配置您的,在应用程序运行和连接时,打开 Chrome 浏览器并导航chrome://inspect以查看


在此处输入图片说明

然后 Resources->Web Sql->default.realm


在此处输入图片说明

2021-09-30T02:02:04   回复
IT小君

您还可以使用 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"
2021-09-30T02:02:05   回复
IT小君

如果您每次都懒于使用 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" />
2021-09-30T02:02:05   回复
IT小君

安卓系统(无需root你的设备)

要获取设备上任何 Realm 数据库的副本,请转到Android Studio 中的设备文件资源管理器

导航到/data/data/your.package.name/files/

在那里你会找到你的 *.realm 文件。右键单击,然后另存为确保在保存之前同步。

使用领域浏览器或任何这些可查看* .realm文件:

在此处输入图片说明

2021-09-30T02:02:05   回复
IT小君

有一个解决方法。您可以直接从设备监视器访问该文件。只有在使用模拟器或 root 设备时才能访问此目录。

在 Android Studio 中:

选择

菜单工具AndroidAndroid 设备监视器文件资源管理器数据数据→(您的包名称)→文件→ *db.realm

从设备中提取此文件:

在此处输入图片说明

从 Android Studio 3 canary 1 开始,引入了设备文件资源管理器。您需要在此处查看领域文件。然后,(选择您的包)→ 选择领域文件 → 右键单击​​并保存。

在此处输入图片说明

并在 Realm Browser 中打开文件。您现在可以查看您的数据。

2021-09-30T02:02:05   回复
IT小君

您可以直接访问领域文件。这是我使用过的解决方案。

首先,您可以将位于 '/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 中打开该文件。

2021-09-30T02:02:06   回复
IT小君

这是一个解决方案,它不需要您的手机扎根,通过使用's shell中的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

您将在本地目录中的任何手机上拥有一份数据库副本,然后您可以将其加载到领域浏览器中。

2021-09-30T02:02:06   回复
IT小君

如果您使用模拟器,您现在可以直接访问它。

首先记录文件在模拟器中的路径,如@bmunk所说:

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

其次搜索它并右键单击该文件并选择“另存为”,在对话框中将出现该文件在您的系统中的实际路径。

在此处输入图片说明 您可以从“另存为”对话框中复制路线

然后,只需将路由粘贴到 Realm Studio 的“打开本地文件”对话框中。

(我只在 Windows 中测试过)

2021-09-30T02:02:06   回复
IT小君

两年多来,Realm Browser 已可用于每个操作系统(mac、linux、windows)。

https://docs.realm.io/sync/realm-studio

直接工作。

2021-09-30T02:02:07   回复
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/

2021-09-30T02:02:07   回复
IT小君

保持简单:

/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,请查看 File > Project Structure > SDK Location > Android SDK Location 并附platform-tools加到该路径。
  2. 使用您的应用程序的完全限定名称作为run-as参数
  3. 确定要将领域文件复制到的位置

注意:该文件名为 default.realm,因为我在配置它时没有更改它的名称 - 您的名称可能不同。

2021-09-30T02:02:07   回复
IT小君

您有几个选项可以查看您的 android 领域文件:

  1. 就像@Christian Melchior 说的,你可以从设备中提取你的领域数据库,并使用OSX Realm Browser在你的 Mac 上打开它

  2. 您可以使用我创建的第三方Android Realm 浏览器,使使用Realm进行的 Android 开发更容易一些。应用程序将显示您设备上的所有领域文件,您可以在测试应用程序时实时查看所有领域文件。

  3. 您可以使用 Chrome 浏览器Stetho完整说明如何使用 Setho 由@Jemshit Iskendero 回答提供。

2021-09-30T02:02:07   回复
IT小君

Realm Browser弃用,请改用Realm Studio

这里

查看文件路径

console.log(realm.path)

以 root 身份登录 adb

adb root

将领域文件拉到本地目录

adb pull /data/data/{app.identifier.com}/files/default.realm .

Realm Studio 中的结果视图

Realm studio 中的结果视图

2021-09-30T02:02:08   回复
IT小君

这是一个像我这样的懒人的外壳:)

.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
2021-09-30T02:02:08   回复