הגיבוי שלי איבד כל תמונה
בניתי כפתור גיבוי עבור מעקב מצב רוח (mood tracker) לא מקוון.
הוא ייצא נתונים לקובץ JSON. משתמשים יכלו לשמור אותו ולהעביר אותו לטלפון חדש. זה נראה מושלם.
אז שיניתי את ה-package ID של האפליקציה. ניסיתי התקנה נקייה במכשיר חדש ושחזרתי את הגיבוי.
רשומות הטקסט חזרו. כל התמונות נעלמו.
הבנתי את הטעות שלי. הגיבוי לא היה גיבוי אמיתי. הוא היה רק רשימה של מצביעים (pointers) לקבצים שכבר לא היו קיימים.
האפליקציה שמרה תמונות על הדיסק. בסיס הנתונים החזיק את נתיב הקובץ.
הנתיב נראה כך: file:///data/user/0/com.example.app/files/entry_media/image.jpg
כשייצאתי את ה-JSON, שמרתי רק את הנתיב הזה. באותו מכשיר, הייבוא עובד כי הקבצים עדיין שם.
במכשיר חדש, הנתיבים האלה מצביעים לכלום. המשתמש רואה תמונות ממוזערות (thumbnails) שבורות וחושב שהאפליקציה מחקה את הזיכרונות שלו.
אם הייצוא שלכם מכיל רק נתיבי קבצים, אין לכם גיבוי נייד. יש לכם גיבוי שעובד רק על המכשיר שלא צריך גיבוי.
גיבוי אמיתי חייב להכיל את הנתונים עצמם.
שיניתי את התהליך. עכשיו, הייצוא קורא כל תמונה והופך אותה למחרוזת Base64 בתוך ה-JSON.
לגישה הזו יש מחירים (trade-offs): • גודל הקובץ גדל בכ-33 אחוזים. • ספריות גדולות דורשות יותר זיכרון במהלך הייצוא.
בחרתי בדייקנות על פני גודל הקובץ. גיבוי גדול הוא שימושי. גיבוי זעיר שמאבד את כל התמונות הוא חסר ערך.
שיניתי גם את האופן שבו אני מטפל בייבוא כדי להבטיח מהירות ובטיחות:
- כותבים את כל התמונות לדיסק של המכשיר החדש תחילה. זה קורה מחוץ לטרנזקציית בסיס הנתונים כדי לשמור על מהירות.
- מריצים טרנזקציה אחת בבסיס הנתונים כדי לקשר את הנתיבים המקומיים החדשים לרשומות.
בניתי גם את המערכת כך שתתפקד בצורה רכה במקרה של שגיאה (fail soft). אם תמונה אחת חסרה או אינה ניתנת לקריאה, האפליקציה מדלגת עליה וממשיכה לבאה בתור. תמונה שבורה אחת לא אמורה להכשיל תהליך שחזור שלם.
לקחים שנלמדו:
- תבדקו בדרך הנכונה. ייצאו במכשיר אחד, מחקו את הנתונים שלו, ואז ייבאו בהתקנה נקייה. ייבוא חוזר באותו המכשיר מסתיר באגים.
- העבירו את הבייטים (bytes). אם נתונים חייבים לשרוד החלפת מכשיר, העבירו את הנתונים עצמם, לא את הכתובת.
מקור: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36
