Was passiert mit den SharedPreferences beim Aktualisieren einer Android-App?

82

Ich habe Benutzereinstellungen in den SharedPreferences in meiner App gespeichert. Was passiert mit den SharedPreferences, wenn ich die App über den Google Play Store auf eine neue Version der App aktualisiere?

Werden die SharedPrefernces nach dem Update noch vorhanden sein oder werden sie gelöscht?

Bisher habe ich keine Antwort im Web oder im Stackoverflow gefunden (darf ich mit falschen Schlüsselwörtern suchen?).

Können Sie mich auf einige Links verweisen, die diesen Prozess beschreiben?

Bearbeiten: In der Zwischenzeit habe ich auch eine andere Antwort gefunden: SharedPreferences-Verhalten beim Aktualisieren / Deinstallieren

Bearbeiten 2: Seit ich diese Frage zum ersten Mal gestellt habe, habe ich kürzlich erfahren, dass es seit Android 6.0 (API 23) auch möglich ist, die automatische Sicherungsfunktion zu verwenden, um Ihre freigegebenen Einstellungen zu sichern, wie von Google hier beschrieben . Fügen Sie einfach das allowBackup="true"in Ihre AndroidManifest.xmlDatei ein.

Bruno Bieri
quelle

Antworten:

69

Cristian sagt hier : Ihre Anwendungsdaten bleiben erhalten, wenn Benutzer Updates installieren.

Es muss jedoch dasselbe sein package name, um ein Update der vorherigen App zu erkennen.

EboMike in Warnung Android-Benutzer, dass App-Update zum Verlust von Daten aus der alten App-Version führen könnte? sagt:

Offen gesagt ist es nicht akzeptabel, Daten aufgrund eines Upgrades zu verlieren.

Bearbeiten :

Normalerweise werden die SharedPreferences (sowie andere Benutzerdaten) während des Aktualisierungsvorgangs beibehalten, aber manchmal gehen die Daten aufgrund eines " unbekannten " Problems verloren, und ich denke, sie liegen außerhalb Ihrer Kontrolle. Sie können also einfach glauben, dass die SharedPreferences beibehalten werden ( siehe hier ).

Wenn Sie also vermeiden möchten, dass Benutzerdaten während des Aktualisierungsvorgangs gelöscht werden, müssen Sie die Hauptdaten im externen Speicher speichern (dies kann ein Wechselmedium sein, z. B. eine SD-Karte oder ein interner, nicht entfernbarer Speicher) privat für Ihre App. Oder zumindest für Benutzer zum Sichern von Daten vor dem Upgrade aufbewahren. Überprüfen Sie dann beim ersten Ausführen Ihrer (aktualisierten) App, ob sich eine Sicherungsdatei im externen Speicher befindet oder nicht.

Wenn Sie wissen möchten, was beim Upgrade einer App passieren muss / kann? Habe ich keine gute Beschreibung für this.It kompliziert ist und relativ mit Android Security, Application signing, copy protectionund andere topics.I bedeuten , dass , wenn Sie Zustand Ihrer App in allen oben genannten Bereichen zu ändern, es anderes Ergebnis führt.
Wenn Sie beispielsweise CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ONIhre App aktualisieren, gehen jedoch alle freigegebenen Einstellungen verloren, der Dateizugriff ist unmöglich und ....
Sie müssen sich jedoch um die Bedingungen kümmern, die Ihre neue App being consideredals Update für die vorherige App verursachen (siehe Dinge, die sich nicht ändern können ).

Außerdem müssen Sie sich um Ihren Code kümmern, da dies zum Löschen von Daten Ihrer Datenbanken führen kann (siehe Update-App mit vorinstalliertem SQLite ).

Aber letztendlich können Sie, wenn Sie vorsichtig sind, sagen:

Der Aktualisierungsprozess ersetzt nur die apk-Datei (und damit auch die darin enthaltenen Zeichen, ...) und ändert keine Datenbanken, freigegebenen Einstellungen und andere Dateien, die zur Laufzeit generiert wurden (wahrscheinlich wird in diesem Fall eine neue App mit installiert die UID, die der UID der vorherigen App entspricht).

Sie können diese Seiten für weitere Details sehen:

Hilfe!? Durch die Aktualisierung unserer Anwendung auf dem Markt werden die gespeicherten SharedPreferences gelöscht.
Der Marktkopierschutz unterbricht den Dateizugriff nach dem Update vollständig.
Kann jemand den App-Update-Prozess erklären?

hasanghaforian
quelle
Vielen Dank, es scheint mir, dass die SharedPreferences in Ordnung gehalten werden sollten. Aber gibt es keine offizielle Beschreibung dieses Prozesses?
Bruno Bieri
@viperbone Welcher Prozess? Clareing Shared Preferences? Oder Upgrade der App?
Hasanghaforian
Aktualisieren des Apps-Prozesses. Welche Dinge müssen / können beim Upgrade einer App passieren?
Bruno Bieri
@viperbone Bitte sehen Sie meine Antwort noch einmal. Ich habe weitere Details hinzugefügt.
Hasanghaforian
Noch ein Hinweis: Stellen Sie sicher, dass der Name der gemeinsamen Einstellungen zwischen den Upgrades gleich ist! Ich hatte verschiedene Namen zwischen den Versionen, so dass die neue Version nicht die gespeicherten Einstellungen der vorherigen Version aufnahm ... verschwendete einen ganzen Morgen, um dies zu debuggen ... :-(
henry000dev
6

Nachdem ich über 4 Stunden lang debuggt hatte, stellte ich fest, dass ich ein Modell als String speicherte, indem ich es serialisierte. Eine serialisierbare Klasse hat eine eindeutige ID mit dem Namen serialVersionUID , die zur Laufzeit standardmäßig festgelegt wird. Die ID wird auch anhand des Namens der Klasse, der Schnittstellen und der Variablennamen berechnet. Ich fand heraus, dass ich die Modellklasse geändert, eine Variable hinzugefügt und dann die App aktualisiert habe. Da die Klasse jetzt geändert wurde, sodass eine neue serialVersionUID festgelegt wurde und daher beim Update nicht in der Lage war, die Zeichenfolge zu deserialisieren und das Modell zu erstellen, gab sie java.io.InvalidClassException aus

Legen Sie die serialVersionUID explizit fest, um dieses Problem zu vermeiden

static final long serialVersionUID = 42L;
Abhishek
quelle
Stellen Sie jedoch sicher, dass Ihre Änderungen kompatibel sind, da sonst seltsame Fehler auftreten können.
mjaggard
5

Ich denke, als ich meine Anwendung das letzte Mal über Google Play aktualisiert habe, waren die sharedPreferences nicht betroffen.
Ich habe sie verwendet, um mich automatisch anzumelden, und nach dem Update war dies der Fall.
Es war vor einem Monat, mein Gedächtnis könnte verschwommen sein, also ist es besser, auch die Meinungen anderer Leute zu hören.

Fauler Ninja
quelle