Cosa succederà alle SharedPreferences all'aggiornamento di un'app Android?


86

Ho memorizzato le impostazioni utente in SharedPreferences nella mia app. Cosa succederà alle SharedPreferences quando aggiorno l'app tramite Google Play Store a una nuova versione dell'app?

Le SharedPrefernces saranno ancora presenti dopo l'aggiornamento o verranno eliminate?

Finora non ho trovato una risposta sul Web o su Stackoverflow.

Puoi indicarmi alcuni link che descrivono questo processo?

Modifica: nel frattempo ho trovato anche un'altra risposta: comportamento di SharedPreferences su Aggiorna / Disinstalla

Modifica 2: Da quando ho posto questa domanda per la prima volta da un po 'di tempo, ho recentemente appreso che da Android 6.0 (API 23) è anche possibile utilizzare la funzionalità di backup automatico per proteggere le preferenze condivise come descritto da Google qui .

Basta aggiungere il file allowBackup="true"nel AndroidManifest.xmlfile.

Risposte:


72

Cristian qui dice: i tuoi dati dell'applicazione rimarranno quando l'utente installa gli aggiornamenti.

Ma deve essere con lo stesso package nameper rilevare come un aggiornamento dell'app precedente.

EboMike in Avviso utente Android che l'aggiornamento dell'app potrebbe portare alla perdita di dati dalla vecchia versione dell'app? dice:

Francamente, la perdita di dati a causa di un aggiornamento è inaccettabile.

Modifica :

Normalmente , le SharedPreferences (così come altri dati utente) verranno conservate durante il processo di aggiornamento, ma a volte, a causa di qualche problema " sconosciuto ", i dati potrebbero andare persi e credo che sia fuori dal tuo controllo. Quindi, puoi semplicemente credere che le SharedPreferences verranno mantenute ( vedi qui ).

Quindi, se si desidera evitare di cancellare i dati dell'utente durante l'aggiornamento, è necessario salvare i dati principali in una memoria esterna (può essere un supporto di memorizzazione rimovibile, come una scheda SD o una memoria interna, non rimovibile) e non privato per la tua app, o almeno metterlo da parte per consentire all'utente di eseguire il backup dei dati prima dell'aggiornamento, quindi al primo avvio della tua app (aggiornata), controlla che ci sia un file di backup nella memoria esterna o no.

Se vuoi sapere quali cose devono / possono accadere con l'aggiornamento di un'app? , Non ho nessuna descrizione buono per this.It è complicato e relativa con Android Security, Application signing, copy protectione altre topics.I significa che se si cambia lo stato della tua applicazione in tutti i campi di cui sopra, che provoca risultato diverso.
Ad esempio, se tu CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, la tua App verrà aggiornata ma tutte le tue preferenze condivise andranno perse, l'accesso ai file sarà impossibile e ...
Anche se devi prestare attenzione alle condizioni che causano la tua nuova app being consideredcome aggiornamento per l'app precedente (vedi Cose che non possono cambiare ).

Inoltre devi stare attento al tuo codice, potrebbe essere causato dalla cancellazione dei dati dei tuoi database (vedi app di aggiornamento con SQLite precaricato ).

Ma alla fine, se stai attento, puoi dire:

Il processo di aggiornamento sostituisce solo il file apk (e quindi cosa c'è dentro ad esempio drawables, ...) e non altera i database, le preferenze condivise e qualsiasi altro file generato in fase di esecuzione (probabilmente in questo caso viene installata una nuova App con l'UID che è uguale all'UID dell'App precedente).

Puoi vedere queste pagine per maggiori dettagli:

Aiuto!? L'aggiornamento della nostra applicazione sul mercato cancella le SharedPreferences salvate.
La protezione dalla copia di mercato interrompe completamente l'accesso ai file dopo l'aggiornamento
Qualcuno può spiegare il processo di aggiornamento dell'app?


Grazie, mi sembra che le preferenze condivise DOVREBBERO essere mantenute a posto. Ma non esiste una descrizione ufficiale di questo processo?
Bruno Bieri

@viperbone quale processo? clareing sharedpreferences? o aggiornamento dell'app?
hasanghaforian

Processo di aggiornamento delle app. Quali cose devono / possono accadere con l'aggiornamento di un'app.
Bruno Bieri

@viperbone Per favore, guarda di nuovo la mia risposta. Ho aggiunto ulteriori dettagli.
hasanghaforian,

Un'altra nota: assicurati che il nome della preferenza condivisa sia lo STESSO tra gli aggiornamenti! Avevo nomi diversi tra le versioni, quindi la nuova versione non raccoglieva le preferenze salvate dalla versione precedente ... ho sprecato un'intera mattinata per eseguire il debug di questo ... :-(
henrykodev

7

Dopo il debug per oltre 4 ore ho scoperto che stavo salvando un modello come stringa serializzandolo. Una classe serializzabile ha un ID univoco per nome serialVersionUID , che è impostato di default in fase di esecuzione e l'id è calcolato dal nome della classe, delle interfacce e anche dei nomi delle variabili. Ho scoperto di aver cambiato la classe del modello, aggiunto una variabile e quindi aggiornato l'app. Poiché la classe è ora cambiata, quindi è stato impostato un nuovo serialVersionUID e quindi all'aggiornamento, non è stato in grado di deserializzare la stringa e creare il modello e stava dando java.io.InvalidClassException

Imposta in modo esplicito serialVersionUID per evitare questo problema

static final long serialVersionUID = 42L;

1
Ma assicurati che le tue modifiche siano compatibili o potresti ottenere bug strani.
mjaggard

5

Penso che quando ho aggiornato la mia applicazione l'ultima volta tramite Google Play, le preferenze condivise non sono state influenzate.
Li stavo usando per accedere automaticamente e dopo l'aggiornamento lo ha fatto.
È stato un mese fa, la mia memoria potrebbe diventare confusa, quindi è meglio ascoltare anche le opinioni di altre persone.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.