نسختي الاحتياطية فقدت كل الصور

لقد قمت ببناء زر للنسخ الاحتياطي لتطبيق تتبع الحالة المزاجية الذي يعمل دون اتصال بالإنترنت.

كان التطبيق يصدر البيانات إلى ملف JSON. كان بإمكان المستخدمين حفظه ونقله إلى هاتف جديد. بدا الأمر مثاليًا.

ثم قمت بتغيير معرف حزمة التطبيق (package ID). حاولت تثبيت نسخة جديدة على جهاز جديد واستعادة النسخة الاحتياطية.

عادت المدخلات النصية، لكن كل الصور اختفت.

أدركت خطئي. لم تكن النسخة الاحتياطية نسخة حقيقية؛ بل كانت مجرد قائمة من المؤشرات (pointers) لملفات لم تعد موجودة.

كان التطبيق يخزن الصور على القرص، بينما تحتفظ قاعدة البيانات بمسار الملف.

كان المسار يبدو هكذا: file:///data/user/0/com.example.app/files/entry_media/image.jpg

عندما قمت بتصدير ملف JSON، قمت بحفظ ذلك المسار فقط. على نفس الجهاز، تعمل عملية الاستيراد لأن الملفات لا تزال موجودة.

أما على جهاز جديد، فإن تلك المسارات لا تشير إلى شيء. يرى المستخدم صورًا مصغرة تالفة ويعتقد أن التطبيق قد حذف ذكرياته.

إذا كان التصدير الخاص بك يحمل مسارات الملفات فقط، فأنت لا تملك نسخة احتياطية قابلة للنقل. بل تملك نسخة احتياطية تعمل فقط على الجهاز الذي لا يحتاج إليها أصلاً.

النسخة الاحتياطية الحقيقية يجب أن تحتوي على البيانات الفعلية.

لقد قمت بتغيير العملية. الآن، يقوم التصدير بقراءة كل صورة وتحويلها إلى سلسلة Base64 داخل ملف JSON.

هذا النهج له مقايضات: • يزداد حجم الملف بنسبة 33 بالمائة تقريبًا. • تتطلب المكتبات الكبيرة ذاكرة أكبر أثناء عملية التصدير.

لقد اخترت الدقة على حساب حجم الملف. فالنسخة الاحتياطية الكبيرة مفيدة، أما النسخة الصغيرة التي تفقد جميع الصور فهي بلا قيمة.

لقد قمت أيضًا بتغيير كيفية معالجة عمليات الاستيراد لضمان السرعة والأمان:

  1. كتابة جميع الصور على قرص الجهاز الجديد أولاً. يتم ذلك خارج عملية قاعدة البيانات (database transaction) للحفاظ على السرعة.
  2. تشغيل عملية قاعدة بيانات واحدة لربط المسارات المحلية الجديدة بالمدخلات.

لقد قمت أيضًا ببناء النظام ليعمل بمرونة عند الفشل (fail soft). إذا كانت إحدى الصور مفقودة أو غير قابلة للقراءة، يتخطاها التطبيق وينتقل إلى التالية. لا ينبغي لصورة واحدة تالفة أن تتسبب في فشل عملية الاستعادة بأكملها.

الدروس المستفادة:

  • اختبر بالطريقة الصحيحة. قم بالتصدير على جهاز واحد، ثم امسح بياناته، ثم استورد البيانات على تثبيت نظيف. إعادة الاستيراد على نفس الجهاز تخفي الأخطاء البرمجية.
  • انقل البايتات (bytes). إذا كان يجب أن تنجو البيانات من تغيير الجهاز، فانقل البيانات الفعلية، وليس العنوان.

المصدر: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36