ไฟล์สำรองข้อมูลของผมทำรูปภาพหายไปทั้งหมด
ผมสร้างปุ่มสำรองข้อมูลสำหรับแอปบันทึกอารมณ์แบบออฟไลน์
มันจะส่งออกข้อมูลเป็นไฟล์ JSON ซึ่งผู้ใช้สามารถบันทึกและย้ายไปยังโทรศัพท์เครื่องใหม่ได้ ดูเหมือนว่ามันจะสมบูรณ์แบบแล้ว
แต่แล้วผมก็เปลี่ยน App Package ID ผมลองติดตั้งแอปใหม่บนเครื่องใหม่แล้วลองกู้คืนข้อมูลสำรองดู
ข้อความที่บันทึกไว้กลับมาครบ แต่รูปภาพทุกรูปหายไปหมดเลย
ผมจึงตระหนักถึงความผิดพลาดของตัวเอง การสำรองข้อมูลนั้นไม่ใช่การสำรองข้อมูลที่แท้จริง แต่มันเป็นเพียงรายการของตัวชี้ (pointers) ไปยังไฟล์ที่ไม่มีอยู่อีกต่อไปแล้ว
แอปเก็บรูปภาพไว้ในดิสก์ ส่วนฐานข้อมูลเก็บเพียงเส้นทางไฟล์ (file path)
เส้นทางไฟล์มีลักษณะดังนี้:
file:///data/user/0/com.example.app/files/entry_media/image.jpg
ตอนที่ผมส่งออก JSON ผมบันทึกแค่เส้นทางนั้น ซึ่งถ้าทำในเครื่องเดิม การนำเข้าข้อมูลจะใช้งานได้เพราะไฟล์ยังคงอยู่ที่เดิม
แต่เมื่อย้ายไปเครื่องใหม่ เส้นทางเหล่านั้นกลับชี้ไปยังความว่างเปล่า ผู้ใช้จะเห็นแค่รูปตัวอย่างที่เสีย (broken thumbnails) และคิดว่าแอปได้ลบความทรงจำของพวกเขาไปแล้ว
หากการส่งออกข้อมูลของคุณมีเพียงแค่เส้นทางไฟล์ นั่นไม่ใช่การสำรองข้อมูลที่พกพาได้ (portable backup) แต่มันคือการสำรองข้อมูลที่ใช้งานได้เฉพาะกับเครื่องเดิมเท่านั้น
การสำรองข้อมูลที่แท้จริงต้องประกอบด้วยข้อมูลจริง ๆ
ผมจึงเปลี่ยนกระบวนการใหม่ ตอนนี้การส่งออกจะอ่านรูปภาพแต่ละรูปแล้วแปลงเป็นสตริง Base64 ไว้ภายในไฟล์ JSON
วิธีนี้มีข้อแลกเปลี่ยน (trade-offs) คือ: • ขนาดไฟล์จะเพิ่มขึ้นประมาณ 33 เปอร์เซ็นต์ • หากมีคลังรูปภาพขนาดใหญ่ จะต้องใช้หน่วยความจำมากขึ้นในระหว่างการส่งออก
ผมเลือกความถูกต้องแม่นยำมากกว่าขนาดไฟล์ ไฟล์สำรองที่มีขนาดใหญ่ยังคงมีประโยชน์ แต่ไฟล์สำรองขนาดจิ๋วที่ทำรูปหายหมดนั้นไม่มีค่าอะไรเลย
ผมยังเปลี่ยนวิธีการจัดการการนำเข้าข้อมูลเพื่อให้มั่นใจในเรื่องความเร็วและความปลอดภัยด้วย:
- เขียนรูปภาพทั้งหมดลงในดิสก์ของเครื่องใหม่ก่อน โดยขั้นตอนนี้จะทำนอก database transaction เพื่อความรวดเร็ว
- รัน database transaction เพียงครั้งเดียวเพื่อเชื่อมโยงเส้นทางไฟล์ในเครื่องใหม่เข้ากับรายการข้อมูล
ผมยังออกแบบระบบให้ทำงานแบบ fail soft ด้วย หากรูปภาพหนึ่งรูปหายไปหรืออ่านไม่ได้ แอปจะข้ามรูปนั้นไปและไปทำรูปถัดไป รูปที่เสียเพียงรูปเดียวไม่ควรทำให้การกู้คืนข้อมูลทั้งหมดพังลง
บทเรียนที่ได้รับ:
- ทดสอบให้ถูกวิธี: ลองส่งออกข้อมูลจากเครื่องหนึ่ง ล้างเครื่องนั้น แล้วลองนำเข้าข้อมูลในเครื่องที่เพิ่งติดตั้งแอปใหม่ การนำเข้าข้อมูลซ้ำในเครื่องเดิมจะทำให้มองไม่เห็นบั๊ก
- ย้ายข้อมูลไปทั้งชุด (Carry the bytes): หากข้อมูลต้องอยู่รอดจากการเปลี่ยนเครื่อง ให้ย้ายตัวข้อมูลจริง ๆ ไป ไม่ใช่แค่ย้ายที่อยู่ (address)
Source: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36
