بکاپ من باعث از دست رفتن تمام عکس‌ها شد

من یک دکمه بکاپ برای یک اپلیکیشن آفلاین ردیاب حالات روحی (mood tracker) ساختم.

این قابلیت، داده‌ها را در یک فایل JSON خروجی می‌گرفت. کاربران می‌توانستند آن را ذخیره کرده و به گوشی جدید منتقل کنند. به نظر بی‌نقص می‌آمد.

سپس شناسه پکیج (package ID) اپلیکیشن را تغییر دادم. یک نصب تازه روی یک دستگاه جدید را امتحان کردم و بکاپ را بازیابی کردم.

متن‌ها برگشتند. اما تمام عکس‌ها از بین رفته بودند.

متوجه اشتباهم شدم. آن بکاپ، یک بکاپ واقعی نبود. فقط لیستی از اشاره‌گرها (pointers) به فایل‌هایی بود که دیگر وجود نداشتند.

اپلیکیشن عکس‌ها را روی دیسک ذخیره می‌کرد. دیتابیس فقط مسیر فایل را نگه می‌داشت.

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

وقتی JSON را خروجی می‌گرفتم، فقط همان مسیر را ذخیره می‌کردم. روی همان دستگاه، فرآیند وارد کردن (import) کار می‌کند چون فایل‌ها هنوز آنجا هستند.

اما روی یک دستگاه جدید، آن مسیرها به هیچ‌چیز اشاره می‌کنند. کاربر تصاویر بندانگشتی (thumbnails) خراب را می‌بیند و فکر می‌کند اپلیکیشن خاطراتش را پاک کرده است.

اگر خروجی شما فقط شامل مسیر فایل‌ها باشد، شما یک بکاپ قابل حمل (portable) ندارید. شما بکاپی دارید که فقط روی همان دستگاهی کار می‌کند که اصلاً نیازی به بکاپ ندارد.

یک بکاپ واقعی باید حاوی خودِ داده‌ها باشد.

من فرآیند را تغییر دادم. حالا، هنگام خروجی گرفتن، هر عکس خوانده شده و به یک رشته Base64 در داخل JSON تبدیل می‌شود.

این روش مزایا و معایبی دارد: • حجم فایل حدود ۳۳ درصد افزایش می‌یابد. • کتابخانه‌های بزرگ در هنگام خروجی گرفتن، حافظه بیشتری نیاز دارند.

من صحت داده‌ها را بر حجم فایل ترجیح دادم. یک بکاپ حجیم مفید است، اما یک بکاپ بسیار کوچک که تمام تصاویر را از دست می‌دهد، بی‌ارزش است.

همچنین نحوه مدیریت وارد کردن (import) را تغییر دادم تا سرعت و امنیت تضمین شود:

  1. ابتدا تمام عکس‌ها را روی دیسک دستگاه جدید بنویسید. این کار خارج از تراکنش دیتابیس انجام می‌شود تا سرعت حفظ شود.
  2. یک تراکنش دیتابیس واحد را برای پیوند دادن مسیرهای محلی جدید به ورودی‌ها اجرا کنید.

همچنین سیستم را طوری طراحی کردم که در صورت بروز خطا، به نرم (fail soft) عمل کند. اگر یک عکس مفقود یا غیرقابل خواندن باشد، اپلیکیشن از آن عبور کرده و به سراغ بعدی می‌رود. یک تصویر خراب نباید کل فرآیند بازیابی را با شکست مواجه کند.

درس‌های آموخته شده:

  • به روش درست تست کنید. روی یک دستگاه خروجی بگیرید، آن را پاک کنید و روی یک نصب تازه وارد کنید. وارد کردن مجدد روی همان دستگاه، باگ‌ها را پنهان می‌کند.
  • بایت‌ها را جابه‌جا کنید. اگر داده‌ها باید از تغییر دستگاه جان سالم به در ببرند، خودِ داده‌ها را منتقل کنید، نه آدرس آن‌ها را.

Source: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36