Mijn backup verloor elke foto

Ik heb een backup-knop gebouwd voor een offline mood tracker.

Het exporteerde gegevens naar een JSON-bestand. Gebruikers konden dit opslaan en naar een nieuwe telefoon verplaatsen. Het leek perfect.

Toen veranderde ik de app-package ID. Ik probeerde een schone installatie op een nieuw apparaat en herstelde de backup.

De tekstvermeldingen kwamen terug. Elke foto was weg.

Ik besefte mijn fout. De backup was geen echte backup. Het was slechts een lijst met verwijzingen naar bestanden die niet meer bestonden.

De app sloeg foto's op op de schijf. De database bevatte het bestandspad.

Het pad zag er zo uit: file:///data/user/0/com.example.app/files/entry_media/image.jpg

Toen ik de JSON exporteerde, sloeg ik alleen dat pad op. Op hetzelfde apparaat werkt de import omdat de bestanden er nog zijn.

Op een nieuw apparaat verwijzen die paden naar niets. De gebruiker ziet kapotte miniaturen en denkt dat de app hun herinneringen heeft verwijderd.

Als je export alleen bestandspaden bevat, heb je geen draagbare backup. Je hebt een backup die alleen werkt op de machine die er geen nodig heeft.

Een echte backup moet de eigenlijke gegevens bevatten.

Ik heb het proces aangepast. Nu leest de export elke foto en zet deze om naar een Base64-string binnen de JSON.

Deze aanpak heeft nadelen: • De bestandsgrootte neemt met ongeveer 33 procent toe. • Grote bibliotheken vereisen meer geheugen tijdens de export.

Ik koos voor juistheid boven bestandsgrootte. Een grote backup is nuttig. Een piepkleine backup die alle afbeeldingen verliest, is waardeloos.

Ik heb ook de manier waarop ik imports afhandel aangepast om snelheid en veiligheid te garanderen:

  1. Schrijf eerst alle foto's naar de schijf van het nieuwe apparaat. Dit gebeurt buiten de database-transactie om het snel te houden.
  2. Voer een enkele database-transactie uit om de nieuwe lokale paden aan de vermeldingen te koppelen.

Ik heb het systeem ook zo gebouwd dat het 'fail soft' werkt. Als een foto ontbreekt of onleesbaar is, slaat de app deze over en gaat hij door naar de volgende. Eén kapotte afbeelding mag niet het hele herstelproces laten crashen.

Geleerde lessen:

  • Test op de juiste manier. Exporteer op het ene apparaat, wis het, en importeer op een schone installatie. Het opnieuw importeren op hetzelfde apparaat verbergt bugs.
  • Neem de bytes mee. Als gegevens een apparaatwissel moeten overleven, verplaats dan de eigenlijke gegevens, niet het adres.

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