ฉันเพิ่งค้นพบอาณาจักรและต้องการสำรวจโดยละเอียดยิ่งขึ้นดังนั้นฉันจึงตัดสินใจสร้างแอปพลิเคชันตัวอย่างและมีปัญหากับมัน จนถึงตอนนี้ดีมาก
อย่างไรก็ตามสิ่งหนึ่งที่ฉันยังไม่สามารถทำงานออกมาได้คือวิธีดูฐานข้อมูลของฉันใน Realm Browser สิ่งนี้สามารถทำได้?
ฉันเพิ่งค้นพบอาณาจักรและต้องการสำรวจโดยละเอียดยิ่งขึ้นดังนั้นฉันจึงตัดสินใจสร้างแอปพลิเคชันตัวอย่างและมีปัญหากับมัน จนถึงตอนนี้ดีมาก
อย่างไรก็ตามสิ่งหนึ่งที่ฉันยังไม่สามารถทำงานออกมาได้คือวิธีดูฐานข้อมูลของฉันใน Realm Browser สิ่งนี้สามารถทำได้?
คำตอบ:
ปัจจุบันเบราว์เซอร์ Realm ไม่สนับสนุนการเข้าถึงฐานข้อมูลโดยตรงบนอุปกรณ์ดังนั้นคุณต้องคัดลอกฐานข้อมูลจากตัวจำลอง / โทรศัพท์เพื่อดู สามารถทำได้โดยใช้ ADB:
adb pull /data/data/<packagename>/files/ .
Realm.getInstance(new RealmConfiguration.Builder().build())
คำสั่งที่จะดึงไฟล์อาณาจักรทั้งหมดที่สร้างขึ้นโดยใช้ default.realm
ฐานข้อมูลเริ่มต้นที่เรียกว่า
โปรดทราบว่าสิ่งนี้จะใช้งานได้กับอีมูเลเตอร์หรือหากอุปกรณ์ถูกรูท
ตอนนี้คุณสามารถดู Realm DB บนเบราว์เซอร์ Chrome โดยใช้Stethoพัฒนาโดย Facebook ตามค่าเริ่มต้น Stetho จะอนุญาตให้ดู Sqlite เครือข่ายการแบ่งปันคำแปล แต่ด้วยปลั๊กอินเพิ่มเติมที่นี่อนุญาตให้ดู Realm ได้เช่นกัน
หลังจากกำหนดค่าApplication
คลาสของคุณด้วยไลบรารีด้านบนในขณะที่แอปทำงานและเชื่อมต่อให้เปิดเบราว์เซอร์ Chrome แล้วไปchrome://inspect
ที่
แล้วก็ Resources->Web Sql->default.realm
https://github.com/uPhyca/stetho-realm/raw/master/maven-repo
ตามที่แสดงไว้ที่นี่github.com/uPhyca/stetho-realm
นอกจากนี้คุณยังสามารถดึงไฟล์ของคุณจากอุปกรณ์ที่ไม่รูทโดยใช้เชลล์ 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"
adb exec-out run-as package.name cat files/your_database_file_name < your_database_file_name
หากคุณขี้เกียจที่จะรับไฟล์ฐานข้อมูล 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" />
หากต้องการรับสำเนาของฐานข้อมูล Realm ใด ๆ บนอุปกรณ์ของคุณให้ไปที่Device File Explorerใน Android Studio
/data/data/your.package.name/files/
นำทางไปยัง
คุณจะพบไฟล์ * .realm ของคุณ คลิกขวาแล้วบันทึกเป็น ตรวจสอบให้แน่ใจว่าได้ซิงโครไนซ์ก่อนที่จะบันทึก
ใช้Realm Browserหรือไฟล์เหล่านี้เพื่อดูไฟล์ * .realm:
มีวิธีแก้ปัญหาคือ คุณสามารถเข้าถึงไฟล์โดยตรงจากการตรวจสอบอุปกรณ์ คุณสามารถเข้าถึงไดเร็กทอรีนี้เฉพาะเมื่อคุณใช้อีมูเลเตอร์หรืออุปกรณ์รูท
ใน Android Studio:
เลือก
เครื่องมือเมนู→ Android →การตรวจสอบอุปกรณ์ Android → ไฟล์ Explorer → ข้อมูล → ข้อมูล → (ชื่อแพ็คเกจของคุณ) → ไฟล์ → * db.realm
ดึงไฟล์นี้จากอุปกรณ์:
จาก Android Studio 3 canary 1 ได้เปิดตัว Device File Explorer คุณต้องดูไฟล์ realm ที่นี่ จากนั้น (เลือกแพ็คเกจของคุณ) →เลือกไฟล์ขอบเขต→คลิกขวาแล้วบันทึก
และเปิดไฟล์ลงใน Realm Browser คุณสามารถดูข้อมูลของคุณได้ในขณะนี้
คุณสามารถเข้าถึงไฟล์ 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
นี่คือวิธีการแก้ปัญหาที่ไม่ต้องการให้โทรศัพท์ของคุณถูกรูทโดยการใช้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 ได้
ตอนนี้คุณสามารถเข้าถึงได้โดยตรงหากคุณใช้อีมูเลเตอร์
ก่อนบันทึกเส้นทางที่ไฟล์อยู่ในโปรแกรมจำลองเป็น @bmunk พูดว่า:
Log.d(TAG, "path: " + realm.getPath());
ค้นหาครั้งที่สองแล้วคลิกขวาที่ไฟล์และเลือก "บันทึกเป็น" บนกล่องโต้ตอบจะปรากฏเส้นทางที่ไฟล์นั้นอยู่ในระบบของคุณ
จากนั้นเพียงวางเส้นทางบนกล่องโต้ตอบ "เปิดไฟล์ในเครื่อง" ของ Realm Studio
(ฉันทดสอบใน Windows เท่านั้น)
นี่คือเชลล์สคริปต์ที่พร้อมใช้งานของฉัน เพียงเปลี่ยนชื่อแพ็คเกจและเส้นทาง 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/
ทำให้มันง่าย:
/Users/inti/Library/Android/sdk/platform-tools/adb exec-out run-as com.mydomain.myapp cat files/default.realm > ~/Downloads/default.realm
คำอธิบาย:
adb
ติดตั้งของคุณ หากคุณใช้ Android Studio ให้ดูที่ไฟล์> โครงสร้างโครงการ> ที่ตั้ง SDK> ที่ตั้ง Android SDK และต่อท้ายplatform-tools
เส้นทางนั้นrun-as
โต้แย้งหมายเหตุ: ไฟล์นี้เรียกว่า default.realm เพราะฉันไม่ได้เปลี่ยนชื่อเมื่อตั้งค่า - คุณอาจแตกต่างกัน
คุณมีตัวเลือกน้อยเพื่อดูไฟล์ realm android ของคุณ:
Like @Christian Melchior กล่าวว่าคุณสามารถดึงฐานข้อมูล realm ของคุณจากอุปกรณ์และเปิดใน mac ของคุณโดยใช้เบราว์เซอร์ OSX Realm
คุณสามารถใช้เบราว์เซอร์ Android Realmของ บริษัท อื่นที่ฉันสร้างขึ้นเพื่อทำให้การพัฒนา Android นั้นง่ายขึ้นนิดหน่อย แอพจะแสดงไฟล์ realm ทั้งหมดบนอุปกรณ์ของคุณและคุณสามารถดูไฟล์ realm ทั้งหมดของคุณแบบเรียลไทม์ขณะที่ทดสอบแอปของคุณ
คุณสามารถใช้เบราว์เซอร์ Chrome Stethoคำอธิบายแบบเต็มวิธีการใช้ Setho จัดทำโดย @Jemshit Iskendero answer
นี่คือเปลือกสำหรับคนขี้เกียจอย่างฉัน :)
.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" ./
อ้างอิง: