ฉันจะดูไฟล์ Realm ของฉันใน Realm Browser ได้อย่างไร


127

ฉันเพิ่งค้นพบอาณาจักรและต้องการสำรวจโดยละเอียดยิ่งขึ้นดังนั้นฉันจึงตัดสินใจสร้างแอปพลิเคชันตัวอย่างและมีปัญหากับมัน จนถึงตอนนี้ดีมาก

อย่างไรก็ตามสิ่งหนึ่งที่ฉันยังไม่สามารถทำงานออกมาได้คือวิธีดูฐานข้อมูลของฉันใน Realm Browser สิ่งนี้สามารถทำได้?


ต้องการวิธีง่าย ๆ ? ข้ามการบันทึกพา ธ คำสั่ง adb และปวดหัว @devsmash มีคำตอบ: stackoverflow.com/a/49705298/483520
Nolan Amy

คำตอบ:


131

ปัจจุบันเบราว์เซอร์ Realm ไม่สนับสนุนการเข้าถึงฐานข้อมูลโดยตรงบนอุปกรณ์ดังนั้นคุณต้องคัดลอกฐานข้อมูลจากตัวจำลอง / โทรศัพท์เพื่อดู สามารถทำได้โดยใช้ ADB:

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

Realm.getInstance(new RealmConfiguration.Builder().build())คำสั่งที่จะดึงไฟล์อาณาจักรทั้งหมดที่สร้างขึ้นโดยใช้ default.realmฐานข้อมูลเริ่มต้นที่เรียกว่า

โปรดทราบว่าสิ่งนี้จะใช้งานได้กับอีมูเลเตอร์หรือหากอุปกรณ์ถูกรูท


25
คุณยังสามารถบันทึกเส้นทางที่แน่นอนจากแอปของคุณด้วย: Log.d ("", "เส้นทาง:" + realm.getPath ());
bmunk

39
ดังนั้น Realm Browser สำหรับ Mac จึงไม่มีประโยชน์ ใครใช้อีมู
เลเตอร์

10
สำหรับอุปกรณ์ที่ไม่ได้รูทสคริปต์นี้ทำงาน: gist.github.com/jk2K/a66ed67b252b880824b32dd4952d1b39
jmartinalonso

3
หากคุณได้รับข้อผิดพลาดเช่นไฟล์ไม่พบรันคำสั่ง adb root ก่อนที่จะดึงไฟล์ realm
ตัณหา

สิ่งนี้ทำงานได้หลังจากใช้ adb root แต่ไม่ว่าฉันจะทำอะไรไฟล์ realm บอกว่ามันถูกเข้ารหัสเมื่อใช้ realm browssr ใช่ฉันอ่านเกี่ยวกับการคอร์รัปชั่น แต่ก็ไม่มีอะไรที่ฉันพยายามทำอยู่ มีบางสิ่งเปลี่ยนแปลงในอาณาจักรหรือไม่?
Mike Axle

104

ตอนนี้คุณสามารถดู Realm DB บนเบราว์เซอร์ Chrome โดยใช้Stethoพัฒนาโดย Facebook ตามค่าเริ่มต้น Stetho จะอนุญาตให้ดู Sqlite เครือข่ายการแบ่งปันคำแปล แต่ด้วยปลั๊กอินเพิ่มเติมที่นี่อนุญาตให้ดู Realm ได้เช่นกัน

หลังจากกำหนดค่าApplicationคลาสของคุณด้วยไลบรารีด้านบนในขณะที่แอปทำงานและเชื่อมต่อให้เปิดเบราว์เซอร์ Chrome แล้วไปchrome://inspectที่


ป้อนคำอธิบายรูปภาพที่นี่

แล้วก็ Resources->Web Sql->default.realm


ป้อนคำอธิบายรูปภาพที่นี่


2
ไม่สามารถแก้ไขได้: com.uphyca: stetho_realm: 0.8.0 ใครช่วยฉันได้บ้าง ฉันขอโทษฉันไม่ใช่ผู้ใช้ mac ดังนั้นดูเหมือนว่าวิธีนี้เป็นเพียงฉันเท่านั้นที่สามารถเรียกดูไฟล์ฐานข้อมูลของฉันได้
ระวัง 7j

4
คุณเพิ่ม URL 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

1
ดูโพสต์นี้ถ้าใครมีปัญหาในการดูฟิลด์: github.com/uPhyca/stetho-realm/issues/45 .... ฉันเห็นฟิลด์ของฉัน แต่ไม่มีข้อมูล .... hmmm
Mike6679

56

นอกจากนี้คุณยังสามารถดึงไฟล์ของคุณจากอุปกรณ์ที่ไม่รูทโดยใช้เชลล์ ADB และคำสั่งเรียกใช้เป็น

คุณสามารถใช้คำสั่งเหล่านี้เพื่อดึงข้อมูลจากที่เก็บข้อมูลส่วนตัวของแอปของคุณชื่อ 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
ตกลง เนื่องจากเราสามารถตั้งค่าแอปพลิเคชันให้ debuggable เราสามารถดึงไฟล์โดยไม่ต้องรูท
JoshuaTree

มีวิธีอื่นในการดึงฐานข้อมูลจาก apk ที่ไม่สามารถ debuggable ได้หรือไม่?
JEGADEESAN S

หากเป็นไปได้ระบบปฏิบัติการ Android ทั้งหมดจะไม่ปลอดภัยอย่างสมบูรณ์มีโอกาสเป็นไปได้ที่อุปกรณ์ rooted เท่านั้น แต่ฉันไม่เคยทำเลย
Apperside

สิ่งนี้อาจไม่ทำงานบนอุปกรณ์ Samsung เนื่องจากการใช้งานแบบบั๊กกี้
SkorpEN

ดังนั้นเราสามารถใช้สิ่งนี้เพื่อนำเข้าอาณาจักรที่แก้ไขของเรากลับไปยังที่ของมันได้หรือไม่ adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
Ender

52

หากคุณขี้เกียจที่จะรับไฟล์ฐานข้อมูล realm ทุกครั้งที่มี adb คุณสามารถเพิ่มฟังก์ชั่นการส่งออกไปยังโค้ด android ของคุณซึ่งจะส่งอีเมลพร้อมไฟล์ฐานข้อมูล realm ให้กับคุณเป็นไฟล์แนบ

นี่คือตัวอย่าง:

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"));
}

อย่าลืมเพิ่มสิทธิ์ผู้ใช้นี้ลงในไฟล์ Manifest ของคุณ:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3
นี้เป็นสิ่งที่ดีโดยเฉพาะอย่างยิ่งถ้าคุณใช้Pushbullet จากนั้นคุณสามารถส่งข้อความไปยังเบราว์เซอร์ Chrome ของคุณและมันจะทำการดาวน์โหลดไฟล์ ไฟล์ดังกล่าวสามารถเปิดได้ใน Realm Browser
ymerdrengene

1
หยุดทำงานบน Android 8.0
EGHDK

42

สำหรับ Android (ไม่จำเป็นต้องรูทอุปกรณ์ของคุณ)

หากต้องการรับสำเนาของฐานข้อมูล Realm ใด ๆ บนอุปกรณ์ของคุณให้ไปที่Device File Explorerใน Android Studio

/data/data/your.package.name/files/นำทางไปยัง

คุณจะพบไฟล์ * .realm ของคุณ คลิกขวาแล้วบันทึกเป็น ตรวจสอบให้แน่ใจว่าได้ซิงโครไนซ์ก่อนที่จะบันทึก

ใช้Realm Browserหรือไฟล์เหล่านี้เพื่อดูไฟล์ * .realm:

ป้อนคำอธิบายภาพที่นี่


2
วิธีง่ายๆเช่นนี้ควรเป็นคำตอบ
Steven Elliott

อย่างแน่นอน นี่คือวิธี 🙏
โนแลนเอมี่

ตรวจสอบให้แน่ใจว่าแอปของคุณตั้งค่าเป็น debuggable เท็จเพื่อดูข้อมูล
Aman Verma

@AmanVerma เป็น USB ดีบั๊กในตัวเลือกนักพัฒนา การแก้จุดบกพร่อง USB จะต้องเปิดใช้งานเพื่อใช้ Device File Explorer
krhitesh

ผู้ใช้ Linux สามารถดาวน์โหลด realm studio ได้โดยใช้realm.io/products/realm-studioและเปิดไฟล์ realm จากที่นั่น
B.shruti

19

มีวิธีแก้ปัญหาคือ คุณสามารถเข้าถึงไฟล์โดยตรงจากการตรวจสอบอุปกรณ์ คุณสามารถเข้าถึงไดเร็กทอรีนี้เฉพาะเมื่อคุณใช้อีมูเลเตอร์หรืออุปกรณ์รูท

ใน Android Studio:

เลือก

เครื่องมือเมนู→ Android →การตรวจสอบอุปกรณ์ Androidไฟล์ Explorerข้อมูลข้อมูล → (ชื่อแพ็คเกจของคุณ) → ไฟล์ → * db.realm

ดึงไฟล์นี้จากอุปกรณ์:

ป้อนคำอธิบายภาพที่นี่

จาก Android Studio 3 canary 1 ได้เปิดตัว Device File Explorer คุณต้องดูไฟล์ realm ที่นี่ จากนั้น (เลือกแพ็คเกจของคุณ) →เลือกไฟล์ขอบเขต→คลิกขวาแล้วบันทึก

ป้อนคำอธิบายภาพที่นี่

และเปิดไฟล์ลงใน Realm Browser คุณสามารถดูข้อมูลของคุณได้ในขณะนี้


ขอบคุณ แต่มันใช้ไม่ได้กับอุปกรณ์จริงมันใช้ได้กับ Emulator เท่านั้น
pratham kesarkar

1
@prathamkesarkar นั่นคือเหตุผลที่ฉันเขียนอีมูเลเตอร์หรืออุปกรณ์รูทเนื่องจากคุณไม่สามารถเข้าถึงโฟลเดอร์เหล่านี้ในอุปกรณ์ปกติ
Aveek

14

คุณสามารถเข้าถึงไฟล์ realm ได้โดยตรง นี่คือทางออกที่ฉันใช้

ก่อนอื่นคุณสามารถคัดลอกไฟล์ 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

ตอนนี้คุณสามารถเปิดไฟล์ใน Realm Browser


6

นี่คือวิธีการแก้ปัญหาที่ไม่ต้องการให้โทรศัพท์ของคุณถูกรูทโดยการใช้run-asคำสั่งที่อยู่ในadbเปลือกของ เงื่อนไขล่วงหน้าเท่านั้นคือคุณจะต้องมีบิลด์ debug ของแอปของคุณติดตั้งในโทรศัพท์เป้าหมาย

$ 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

คุณจะมีสำเนาของฐานข้อมูลจากโทรศัพท์ใด ๆ ในไดเรกทอรีภายในเครื่องของคุณซึ่งคุณสามารถโหลดลงในเบราว์เซอร์ Realm ได้


1
mac adb เส้นทางเริ่มต้น ... / Library / Android / sdk / platform-tools
Francisco Castro

3

ตอนนี้คุณสามารถเข้าถึงได้โดยตรงหากคุณใช้อีมูเลเตอร์

ก่อนบันทึกเส้นทางที่ไฟล์อยู่ในโปรแกรมจำลองเป็น @bmunk พูดว่า:

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

ค้นหาครั้งที่สองแล้วคลิกขวาที่ไฟล์และเลือก "บันทึกเป็น" บนกล่องโต้ตอบจะปรากฏเส้นทางที่ไฟล์นั้นอยู่ในระบบของคุณ

ป้อนคำอธิบายรูปภาพที่นี่ คุณสามารถคัดลอกเส้นทางจากกล่องโต้ตอบบันทึกเป็น

จากนั้นเพียงวางเส้นทางบนกล่องโต้ตอบ "เปิดไฟล์ในเครื่อง" ของ Realm Studio

(ฉันทดสอบใน Windows เท่านั้น)


1
นี่คือคำตอบที่มีประโยชน์ที่สุดขอบคุณ! ไม่แสดงพา ธ สำหรับ macOS แต่ก็ยังง่ายต่อการค้นหาไฟล์
Maria

1

นี่คือเชลล์สคริปต์ที่พร้อมใช้งานของฉัน เพียงเปลี่ยนชื่อแพ็คเกจและเส้นทาง 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. ตัดสินใจว่าคุณต้องการคัดลอกไฟล์ realm ไปที่ใด

หมายเหตุ: ไฟล์นี้เรียกว่า default.realm เพราะฉันไม่ได้เปลี่ยนชื่อเมื่อตั้งค่า - คุณอาจแตกต่างกัน


1

คุณมีตัวเลือกน้อยเพื่อดูไฟล์ realm android ของคุณ:

  1. Like @Christian Melchior กล่าวว่าคุณสามารถดึงฐานข้อมูล realm ของคุณจากอุปกรณ์และเปิดใน mac ของคุณโดยใช้เบราว์เซอร์ OSX Realm

  2. คุณสามารถใช้เบราว์เซอร์ Android Realmของ บริษัท อื่นที่ฉันสร้างขึ้นเพื่อทำให้การพัฒนา Android นั้นง่ายขึ้นนิดหน่อย แอพจะแสดงไฟล์ realm ทั้งหมดบนอุปกรณ์ของคุณและคุณสามารถดูไฟล์ realm ทั้งหมดของคุณแบบเรียลไทม์ขณะที่ทดสอบแอปของคุณ

  3. คุณสามารถใช้เบราว์เซอร์ Chrome Stethoคำอธิบายแบบเต็มวิธีการใช้ Setho จัดทำโดย @Jemshit Iskendero answer


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.