ฉันจะดูไฟล์ 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.