मेरे बैकअप ने हर फोटो खो दी
मैंने एक ऑफलाइन मूड ट्रैकर के लिए बैकअप बटन बनाया था।
यह डेटा को एक JSON फ़ाइल में एक्सपोर्ट करता था। उपयोगकर्ता इसे सेव कर सकते थे और नए फ़ोन में ले जा सकते थे। यह एकदम सही लग रहा था।
फिर मैंने ऐप का पैकेज ID बदल दिया। मैंने एक नए डिवाइस पर फ्रेश इंस्टॉल किया और बैकअप को रिस्टोर करने की कोशिश की।
टेक्स्ट एंट्रीज़ वापस आ गईं। लेकिन हर एक फोटो गायब थी।
मुझे अपनी गलती का एहसास हुआ। वह बैकअप असली बैकअप नहीं था। वह केवल उन फ़ाइलों के पॉइंटर्स की एक सूची थी जो अब अस्तित्व में नहीं थीं।
ऐप डिस्क पर फ़ोटो स्टोर करता था। डेटाबेस में फ़ाइल पाथ (file path) रहता था।
पाथ कुछ इस तरह दिखता था:
file:///data/user/0/com.example.app/files/entry_media/image.jpg
जब मैंने JSON एक्सपोर्ट किया, तो मैंने केवल वही पाथ सेव किया। उसी डिवाइस पर, इम्पोर्ट काम करता है क्योंकि फ़ाइलें अभी भी वहीं मौजूद हैं।
एक नए डिवाइस पर, वे पाथ किसी चीज़ की ओर इशारा नहीं करते। उपयोगकर्ता को टूटे हुए थंबनेल (thumbnails) दिखाई देते हैं और उन्हें लगता है कि ऐप ने उनकी यादें मिटा दी हैं।
यदि आपका एक्सपोर्ट केवल फ़ाइल पाथ ले जाता है, तो आपके पास पोर्टेबल बैकअप नहीं है। आपके पास ऐसा बैकअप है जो केवल उसी मशीन पर काम करता है जिसे बैकअप की ज़रूरत ही नहीं है।
एक असली बैकअप में वास्तविक डेटा होना चाहिए।
मैंने प्रक्रिया बदल दी। अब, एक्सपोर्ट प्रत्येक फोटो को पढ़ता है और उसे JSON के अंदर एक Base64 स्ट्रिंग में बदल देता है।
इस दृष्टिकोण के कुछ नुकसान (trade-offs) भी हैं: • फ़ाइल का आकार लगभग 33 प्रतिशत बढ़ जाता है। • एक्सपोर्ट के दौरान बड़ी लाइब्रेरीज़ को अधिक मेमोरी की आवश्यकता होती है।
मैंने फ़ाइल आकार के बजाय सटीकता (correctness) को चुना। एक बड़ा बैकअप उपयोगी होता है। लेकिन एक छोटा बैकअप जो सभी इमेज खो देता है, वह बेकार है।
मैंने गति और सुरक्षा सुनिश्चित करने के लिए इम्पोर्ट को हैंडल करने का तरीका भी बदल दिया:
- सबसे पहले सभी फ़ोटो को नए डिवाइस की डिस्क पर लिखें। इसे तेज़ रखने के लिए यह डेटाबेस ट्रांजेक्शन (database transaction) के बाहर किया जाता है।
- नई लोकल पाथ को एंट्रीज़ से जोड़ने के लिए एक सिंगल डेटाबेस ट्रांजेक्शन चलाएं।
मैंने सिस्टम को 'फेल सॉफ्ट' (fail soft) बनाने के लिए भी तैयार किया। यदि एक फोटो गायब है या पढ़ने योग्य नहीं है, तो ऐप उसे छोड़ देता है और अगली फोटो पर बढ़ जाता है। एक टूटी हुई इमेज के कारण पूरा रिस्टोर क्रैश नहीं होना चाहिए।
सीखे गए सबक:
- सही तरीके से टेस्ट करें। एक डिवाइस पर एक्सपोर्ट करें, उसे वाइप (wipe) करें, और फिर क्लीन इंस्टॉल पर इम्पोर्ट करें। उसी डिवाइस पर दोबारा इम्पोर्ट करने से बग्स छिप जाते हैं।
- बाइट्स (bytes) को साथ ले जाएं। यदि डेटा को डिवाइस बदलने पर भी सुरक्षित रखना है, तो केवल एड्रेस नहीं, बल्कि वास्तविक डेटा को मूव करें।
स्रोत: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36
