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

How do I view my Realm file in the Realm Browser?

我刚刚发现了 Realm 并想更详细地探索它,所以我决定创建示例应用程序并将其弄得一团糟。到目前为止一切顺利。

但是,我还没有解决的一件事是如何在 Realm 浏览器中查看我的数据库。如何做到这一点?

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

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

该命令将提取使用 Realm.getInstance(new RealmConfiguration.Builder().build()) 创建的所有 Realm 文件。默认数据库名为 default.realm.

请注意,这仅适用于模拟器或设备已获得 root 权限。

如果你懒得每次使用 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" />

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

首先你可以将位于'/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 .

现在您可以在领域浏览器中打开文件了。

现在您可以在 Chrome 浏览器上查看 Realm DB,使用 Stetho, developed by Facebook. By default, Stetho allows to view Sqlite, network, sharedpreferences but with additional plugin here 也允许查看 Realm。

使用上述库配置 Application class 后,当应用处于 运行 并已连接时,打开 Chrome 浏览器并导航 chrome://inspect 以查看


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


您还可以使用 ADB shell 和 运行-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"

这里有一个 shell 适合像我这样懒惰的人:)

.realm 文件将存储在 .sh 文件旁边的 tmpRealm/ 文件夹中。

#!/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://android.stackexchange.com/a/129665/179720

这是我的 ready-to-use 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

有关此博客的更多详细信息 post:http://medyo.github.io/2016/browse-populate-and-export-realm-database-on-android/

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

在 Android 工作室中:

Select

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

从设备中提取此文件:

从AndroidStudio 3 canary 1开始,引入了Device File Explorer。您需要在此处查看领域文件。然后,(select 你的包) → select 领域文件 → 右键单击​​并 保存。

并在领域浏览器中打开文件。您现在可以看到您的数据了。

保持简单:

/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 因为我在配置它时没有更改它的名称 - 你的可能不同。

这是一个不需要 phone root 的解决方案,方法是使用 adb 的 shell 中的 run-as 命令。唯一的先决条件是您必须在目标 phone.

上安装应用程序的调试版本
$ 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

您将从本地目录中的任何 phone 获得数据库的副本,然后您可以将其加载到 Realm 浏览器中。

查看 android 领域文件的选项很少:

  1. 就像@Christian Melchior 所说的那样,您可以从设备中提取您的领域数据库并使用OSX Realm Browser

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

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

对于 Android(无需对您的设备进行 root)

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

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

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

使用Realm Browser or any of these查看*.realm文件:

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

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

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

其次搜索并右击该文件并选择"Save As",在对话框中会出现该文件在您系统中的真实路径。

然后,只需将路由粘贴到 Realm Studio 的 "Open Local File" 对话框中即可。

(我只在 Windows 中测试过)

两年多来,Realm 浏览器已可用于所有操作系统(mac、linux、windows)。

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

直接工作。

Realm Browser is Deprecated, Use Realm Studio instead.

这里

查看文件路径

console.log(realm.path)

以 root 身份登录 adb

adb root

拉取领域文件到本地目录

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

Realm Studio 中的结果视图

Result view in Realm studio