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


127

我刚刚发现了Realm,并想对其进行更详细的探索,所以我决定创建示例应用程序,并对其进行了一些修改。到目前为止,一切都很好。

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


想要方便吗?跳过路径记录,adb命令和头痛。@devsmash有答案:stackoverflow.com/a/49705298/483520
Nolan Amy

Answers:


131

当前,领域浏览器不支持直接在设备上访问数据库,因此您需要从仿真器/电话复制数据库以进行查看。这可以通过使用ADB来完成:

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

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

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


25
您还可以使用以下命令记录应用程序的确切路径:Log.d(“”,“ path:” + realm.getPath());
bmunk

39
因此,适用于Mac的Realm Browser毫无用处。谁使用模拟器
Jemshit Iskenderov

10
对于非root用户的设备,此脚本有效:gist.github.com/jk2K/a66ed67b252b880824b32dd4952d1b39
jmartinalonso

3
如果您遇到找不到文件之类的错误,请先执行adb root命令,然后再提取领域文件。
兰迪

在使用adb root之后这可以工作,但是无论我做什么,领域文件都表明使用领域browssr时它已加密。是的,我读到了有关腐败的文章,但我没有尝试过。境界发生了变化吗?
Mike Axle

104

现在,您可以使用Facebook开发的Stetho在Chrome浏览器上查看Realm DB 。默认情况下,Stetho允许查看Sqlite,网络,共享首选项,但此处带有其他插件也允许查看Realm。

Application使用上述库配置完班级后,在应用程序运行和连接的情况下,打开Chrome浏览器并导航chrome://inspect以查看


在此处输入图片说明

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


在此处输入图片说明


2
无法解决:com.uphyca:stetho_realm:0.8.0有人可以帮我吗?抱歉,我不是mac用户,所以看来这种方式是我唯一可以浏览我的数据库文件的方式。
注意7j

4
您是否添加了https://github.com/uPhyca/stetho-realm/raw/master/maven-repo如下所示的网址github.com/uPhyca/stetho-realm
Jemshit Iskenderov,

2
我的错,非常感谢!我错过了。现在它可以正常工作了!
注意7j

1
我通过单击其他一些表来查看表“ A”的更改,然后再次单击表“ A” @AlexKost
Jemshit Iskenderov 17/02/24

1
如果有人对查看字段有疑问,请参阅此帖子:github.com/uPhyca/stetho-realm/issues/45 ....我看到了我的字段,但没有数据....
hmmm

56

您还可以使用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"

3
同意 由于我们可以将应用程序设置为可调试的,因此可以使用此文件在没有root用户的情况下提取文件。
JoshuaTree

还有其他方法可以从不可调试的apk中提取数据库吗?
JEGADEESAN S '18年

如果可能的话,整个android操作系统将是完全不安全的,有可能仅在有根设备上才有可能,但我从未做到过
Apperside

由于三星设备的运行方式存在错误,因此这可能无法正常运行。
SkorpEN

因此,我们可以使用它将已编辑的领域导入回到其位置吗?adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender

52

如果您不愿意每次都使用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" />

3
如果使用Pushbullet,则特别好。然后,您可以向Chrome浏览器推送消息,它将下载文件。然后可以在Realm Browser中打开文件
ymerdrengene

1
在Android 8.0上崩溃
EGHDK,

42

对于Android(无需root设备)

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

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

在这里,您将找到* .realm文件。右键单击,然后单击另存为。保存它们之前,请确保进行同步。

使用领域浏览器或以下任何一种来查看* .realm文件:

在此处输入图片说明


2
如此简单的解决方案,现在应该是答案
Steven Elliott

绝对。就是这样 🙏–
诺兰·艾米

确保将您的应用设置为可调试的false,以便查看数据。
阿曼·维尔玛

@AmanVerma开发人员选项中的USB调试。必须启用USB调试才能使用设备文件资源管理器
krhitesh

Linux用户可以使用realm.io/products/realm-studio下载realm studio 并从此处打开领域文件
B.shruti

19

有一种解决方法。您可以直接从设备监视器访问文件。仅当您使用仿真器或有根设备时,您才能访问此目录。

在Android Studio中:

选择

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

从设备中提取此文件:

在此处输入图片说明

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

在此处输入图片说明

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


谢谢。但是,它不适用于实际的设备。它仅适用于仿真器
普拉特姆·凯萨卡

1
@prathamkesarkar,这就是为什么我编写了模拟器或root用户设备的原因,因为您无法在普通设备中访问这些文件夹。
Aveek '17

14

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

首先,您可以将位于“ / 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。

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


6

通过使用外壳程序中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

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


1
mac adb默认路径... / Library / Android / sdk / platform-tools
Francisco Castro

3

现在,如果您使用仿真器,则可以直接访问它。

首先按照@bmunk的说明记录文件在模拟器中的路径:

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

其次搜索它,然后右键单击该文件,然后选择“另存为”,在对话框中将显示该文件确实在您的系统中的路径。

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

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

(我仅在Windows中对此进行了测试)


1
这是最有用的答案,谢谢!不显示macOS的路径,但是仍然很容易找到文件。
玛丽亚

1

这是我现成的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/


1

保持简单:

/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

您可以选择几种方式来查看android领域文件:

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

  2. 您可以使用我创建的第三方Android Realm Browser,使具有领域的android开发变得更加容易。应用程序将向您显示设备上的所有领域文件,并且您可以在测试应用程序时实时查看所有领域文件。

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


0

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

.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.