Yedeklemem Tüm Fotoğrafları Kaybetti

Çevrimdışı bir ruh hali takipçisi için bir yedekleme butonu geliştirdim.

Verileri bir JSON dosyasına aktarıyordu. Kullanıcılar bu dosyayı kaydedip yeni bir telefona taşıyabiliyordu. Kusursuz görünüyordu.

Sonra uygulamanın paket kimliğini (package ID) değiştirdim. Yeni bir cihazda temiz bir kurulum denedim ve yedeği geri yükledim.

Metin girişleri geri geldi. Ancak tüm fotoğraflar gitmişti.

Hatayı fark ettim. Yedekleme gerçek bir yedekleme değildi. Sadece artık var olmayan dosyalara işaret eden bir işaretçi (pointer) listesiydi.

Uygulama fotoğrafları diskte saklıyordu. Veritabanı ise dosya yolunu tutuyordu.

Yol şuna benziyordu: file:///data/user/0/com.example.app/files/entry_media/image.jpg

JSON'ı dışa aktardığımda sadece o yolu kaydediyordum. Aynı cihazda içe aktarma işlemi çalışıyor çünkü dosyalar hâlâ orada.

Yeni bir cihazda ise bu yollar hiçbir yere işaret etmiyor. Kullanıcı bozuk küçük resimler (thumbnails) görüyor ve uygulamanın anılarını sildiğini sanıyor.

Eğer dışa aktarma işleminiz sadece dosya yollarını taşıyorsa, taşınabilir bir yedeğiniz yok demektir. Sadece yedeğe ihtiyacı olmayan bir makinede çalışan bir yedeğiniz var demektir.

Gerçek bir yedekleme, asıl veriyi içermelidir.

Süreci değiştirdim. Artık dışa aktarma işlemi her fotoğrafı okuyor ve JSON içinde bir Base64 dizisine dönüştürüyor.

Bu yaklaşımın bazı dezavantajları var: • Dosya boyutu yaklaşık yüzde 33 oranında artıyor. • Büyük kütüphaneler dışa aktarma sırasında daha fazla bellek gerektiriyor.

Dosya boyutu yerine doğruluğu seçtim. Büyük bir yedekleme kullanışlıdır. Tüm görselleri kaybeden küçücük bir yedekleme ise değersizdir.

Hız ve güvenliği sağlamak için içe aktarma yöntemimi de değiştirdim:

  1. Önce tüm fotoğrafları yeni cihazın diskine yazın. Hızlı olması için bu işlem veritabanı işlemi (transaction) dışında gerçekleşir.
  2. Yeni yerel yolları girişlerle ilişkilendirmek için tek bir veritabanı işlemi çalıştırın.

Ayrıca sistemi "yumuşak hata" (fail soft) verecek şekilde tasarladım. Eğer bir fotoğraf eksikse veya okunamaz durumdaysa, uygulama onu atlar ve bir sonrakine geçer. Tek bir bozuk görsel tüm geri yükleme işlemini çökertmemeli.

Alınan dersler:

  • Doğru şekilde test edin. Bir cihazda dışa aktarın, cihazı sıfırlayın ve temiz bir kurulum üzerine içe aktarın. Aynı cihazda tekrar içe aktarma yapmak hataları gizler.
  • Byte'ları taşıyın. Eğer verinin bir cihaz değişikliğinden sağ çıkması gerekiyorsa, adresi değil asıl veriyi taşıyın.

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