എന്റെ ബാക്കപ്പ് എല്ലാ ഫോട്ടോകളും നഷ്ടപ്പെടുത്തി
ഒരു ഓഫ്ലൈൻ മൂഡ് ട്രാക്കറിനായി (mood tracker) ഞാൻ ഒരു ബാക്കപ്പ് ബട്ടൺ നിർമ്മിച്ചു.
ഇത് ഡാറ്റ ഒരു JSON ഫയലിലേക്ക് എക്സ്പോർട്ട് (export) ചെയ്യുമായിരുന്നു. ഉപയോക്താക്കൾക്ക് ഇത് സേവ് ചെയ്യാനും പുതിയ ഫോണിലേക്ക് മാറ്റാനും കഴിയുമായിരുന്നു. ഇത് തികച്ചും കൃത്യമാണെന്ന് തോന്നി.
പിന്നീട് ഞാൻ ആപ്പിന്റെ പാക്കേജ് ഐഡി (package ID) മാറ്റി. ഒരു പുതിയ ഉപകരണത്തിൽ പുതിയ ഇൻസ്റ്റാളേഷൻ പരീക്ഷിക്കുകയും ബാക്കപ്പ് റീസ്റ്റോർ (restore) ചെയ്യാൻ ശ്രമിക്കുകയും ചെയ്തു.
ടെക്സ്റ്റ് എൻട്രികൾ തിരികെ വന്നു. എന്നാൽ എല്ലാ ഫോട്ടോകളും നഷ്ടപ്പെട്ടു.
എന്റെ തെറ്റ് ഞാൻ തിരിച്ചറിഞ്ഞു. അത് യഥാർത്ഥമായ ഒരു ബാക്കപ്പ് ആയിരുന്നില്ല. നിലവിലില്ലാത്ത ഫയലുകളിലേക്കുള്ള പോയിന്ററുകളുടെ (pointers) ഒരു പട്ടിക മാത്രമായിരുന്നു അത്.
ആപ്പ് ഫോട്ടോകൾ ഡിസ്കിലാണ് സൂക്ഷിച്ചിരുന്നത്. ഡാറ്റാബേസ് ഫയൽ പാത്ത് (file path) മാത്രമാണ് സൂക്ഷിച്ചിരുന്നത്.
പാത്ത് ഇപ്രകാരമായിരുന്നു:
file:///data/user/0/com.example.app/files/entry_media/image.jpg
ഞാൻ JSON എക്സ്പോർട്ട് ചെയ്തപ്പോൾ ആ പാത്ത് മാത്രമേ സേവ് ചെയ്തിരുന്നുള്ളൂ. അതേ ഉപകരണത്തിൽ ഇംപോർട്ട് (import) ചെയ്യുമ്പോൾ ഫയലുകൾ അവിടെത്തന്നെ ഉള്ളതുകൊണ്ട് അത് പ്രവർത്തിക്കും.
എന്നാൽ പുതിയൊരു ഉപകരണത്തിൽ, ആ പാത്തുകൾ ഒന്നിനെയും സൂചിപ്പിക്കുന്നില്ല. ഉപയോക്താവിന് തകരാറിലായ തംബ്നെയിലുകൾ (thumbnails) കാണാൻ സാധിക്കും, ആപ്പ് അവരുടെ ഓർമ്മകൾ ഡിലീറ്റ് ചെയ്തു എന്ന് അവർ കരുതിയാലും സംഭവിക്കാം.
നിങ്ങളുടെ എക്സ്പോർട്ട് ഫയൽ പാത്തുകൾ മാത്രമേ ഉൾക്കൊള്ളുന്നുള്ളൂ എങ്കിൽ, അത് ഒരു പോർട്ടബിൾ ബാക്കപ്പ് അല്ല. അത് ബാക്കപ്പ് ആവശ്യമില്ലാത്ത ഒരു മെഷീനിൽ മാത്രം പ്രവർത്തിക്കുന്ന ഒരു ബാക്കപ്പാണ്.
ഒരു യഥാർത്ഥ ബാക്കപ്പിൽ യഥാർത്ഥ ഡാറ്റ ഉണ്ടായിരിക്കണം.
ഞാൻ ഈ പ്രക്രിയ മാറ്റി. ഇപ്പോൾ, എക്സ്പോർട്ട് ചെയ്യുമ്പോൾ ഓരോ ഫോട്ടോയും വായിച്ച് JSON-നുള്ളിൽ ഒരു Base64 സ്ട്രിംഗ് (string) ആയി മാറ്റുന്നു.
ഈ രീതിക്ക് ചില പോരായ്മകളുണ്ട്: • ഫയൽ സൈസ് ഏകദേശം 33 ശതമാനം വർദ്ധിക്കുന്നു. • വലിയ ലൈബ്രറികൾ എക്സ്പോർട്ട് ചെയ്യുമ്പോൾ കൂടുതൽ മെമ്മറി ആവശ്യമാണ്.
ഫയൽ സൈസിനേക്കാൾ കൃത്യതയ്ക്കാണ് ഞാൻ മുൻഗണന നൽകിയത്. വലിയൊരു ബാക്കപ്പ് ഉപയോഗപ്രദമാണ്. എന്നാൽ എല്ലാ ചിത്രങ്ങളും നഷ്ടപ്പെടുന്ന ഒരു ചെറിയ ബാക്കപ്പ് ഒന്നിനും കൊള്ളില്ല.
വേഗതയും സുരക്ഷയും ഉറപ്പാക്കാൻ ഇംപോർട്ട് ചെയ്യുന്ന രീതിയും ഞാൻ മാറ്റി:
- ആദ്യം എല്ലാ ഫോട്ടോകളും പുതിയ ഉപകരണത്തിന്റെ ഡിസ്കിലേക്ക് എഴുതുക. വേഗത നിലനിർത്താൻ ഇത് ഡാറ്റാബേസ് ട്രാൻസാക്ഷന് (database transaction) പുറത്ത് ചെയ്യുന്നു.
- പുതിയ ലോക്കൽ പാത്തുകളെ എൻട്രികളുമായി ബന്ധിപ്പിക്കാൻ ഒരു സിംഗിൾ ഡാറ്റാബേസ് ട്രാൻസാക്ഷൻ നടത്തുക.
സിസ്റ്റം പരാജയപ്പെട്ടാലും തകരാറിലാകാത്ത രീതിയിൽ (fail soft) ഞാൻ ഇത് നിർമ്മിച്ചു. ഒരു ഫോട്ടോ കാണാനില്ലെങ്കിലോ വായിക്കാൻ കഴിയുന്നില്ലെങ്കിലോ, ആപ്പ് അത് ഒഴിവാക്കി അടുത്തതിലേക്ക് പോകും. ഒരു തകരാറിലായ ചിത്രം കാരണം മുഴുവൻ റീസ്റ്റോർ പ്രക്രിയയും പരാജയപ്പെടരുത്.
പഠിച്ച പാഠങ്ങൾ:
- ശരിയായ രീതിയിൽ പരിശോധിക്കുക. ഒരു ഉപകരണത്തിൽ എക്സ്പോർട്ട് ചെയ്യുക, അത് ഡിലീറ്റ് ചെയ്യുക, തുടർന്ന് ഒരു ക്ലീൻ ഇൻസ്റ്റാളേഷനിൽ ഇംപോർട്ട് ചെയ്യുക. അതേ ഉപകരണത്തിൽ തന്നെ വീണ്ടും ഇംപോർട്ട് ചെയ്യുന്നത് ബഗുകൾ (bugs) മറച്ചുവെച്ചേക്കാം.
- ബൈറ്റുകൾ (bytes) കൈമാറുക. ഡാറ്റ ഒരു ഉപകരണം മാറുന്നതിനൊപ്പവും നിലനിൽക്കണമെങ്കിൽ, അതിന്റെ അഡ്രസ്സ് അല്ല, മറിച്ച് യഥാർത്ഥ ഡാറ്റ തന്നെ മാറ്റുക.
Source: https://dev.to/diven_rastdus_c5af27d68f3/my-offline-apps-backup-lost-every-photo-on-a-new-phone-3d36
