ไฟล์สำรองข้อมูลของผมทำรูปภาพหายไปทั้งหมด

ผมสร้างปุ่มสำรองข้อมูลสำหรับแอปบันทึกอารมณ์แบบออฟไลน์

มันจะส่งออกข้อมูลเป็นไฟล์ 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 เปอร์เซ็นต์ • หากมีคลังรูปภาพขนาดใหญ่ จะต้องใช้หน่วยความจำมากขึ้นในระหว่างการส่งออก

ผมเลือกความถูกต้องแม่นยำมากกว่าขนาดไฟล์ ไฟล์สำรองที่มีขนาดใหญ่ยังคงมีประโยชน์ แต่ไฟล์สำรองขนาดจิ๋วที่ทำรูปหายหมดนั้นไม่มีค่าอะไรเลย

ผมยังเปลี่ยนวิธีการจัดการการนำเข้าข้อมูลเพื่อให้มั่นใจในเรื่องความเร็วและความปลอดภัยด้วย:

  1. เขียนรูปภาพทั้งหมดลงในดิสก์ของเครื่องใหม่ก่อน โดยขั้นตอนนี้จะทำนอก database transaction เพื่อความรวดเร็ว
  2. รัน 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