2012-09-28 10 views
59

Mam zapisane ustawienia użytkownika w SharedPreferences w mojej aplikacji. Co stanie się z SharedPreferences po aktualizacji aplikacji przez Google Play Store do nowej wersji aplikacji?Co stanie się z SharedPreferences przy aktualizacji aplikacji na Androida?

Czy pliki SharedPrefernces będą dostępne po aktualizacji, czy też zostaną usunięte?

Do tej pory nie znalazłem odpowiedzi w Internecie lub Stackoverflow (czy mogę wyszukiwać błędne słowa kluczowe?).

Czy możesz wskazać mi jakieś linki, które opisują ten proces?

Edit: Tymczasem znalazłem inną odpowiedź też: SharedPreferences behaviour on Update/Uninstall

Edit 2: Od czasu ostatniego całkiem sporo, gdy po raz pierwszy zwróciła na to pytanie Niedawno dowiedziałem się, że skoro Android 6.0 (API 23) możliwe jest również użycie funkcji automatycznego tworzenia kopii zapasowych do secure swoich wspólnych preferencji opisanych przez Google here. Po prostu dodaj plik allowBackup="true" do swojego pliku .

Odpowiedz

57

Cristian here mówi: dane aplikacji pozostaną, gdy użytkownik zainstaluje aktualizacje.

Ale musi być z tym samym package name wykryć jako aktualizację poprzedniej aplikacji.

EboMike w Warning Android user that app update could lead to losing data from old app version? mówi:

Szczerze mówiąc, utraty danych z powodu modernizacji jest niedopuszczalne.

Edit:

Normalnie, że SharedPreferences (jak również inne dane użytkownika) zostaną utrzymane podczas procesu aktualizacji, ale czasami, z powodu jakiegoś "nieznanego" problemu, dane mogą się zagubić i myślę, że jest to poza kontrolą. Możesz więc po prostu uwierzyć, że SharedPreferences będą przechowywane (see here).

Jeśli chcesz uniknąć usuwania danych użytkownika podczas aktualizacji, musisz zapisać główne dane w pamięci zewnętrznej (może to być wymienny nośnik pamięci, na przykład karta SD lub wewnętrzne, nieusuwane miejsce .) i nie prywatne dla twojej App.Or przynajmniej odłożyć dla użytkownika do tworzenia kopii zapasowych danych przed aktualizacją. Następnie w pierwszym uruchomieniu twojej (uaktualnionej) aplikacji, sprawdź, czy jest jakiś plik kopii zapasowej w pamięci zewnętrznej lub nie.

Jeśli chcesz wiedzieć, Co musi/może się stać podczas aktualizacji aplikacji?, Nie opisałem tego dobrze.Jest to skomplikowane i względne z Android Security, Application signing, copy protection i innymi tematami. Mam na myśli to, że jeśli zmienisz stan swojej aplikacji w dowolnych powyższych polach, spowoduje to inny wynik.
Na przykład, jeśli masz CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, Twoja aplikacja zostanie zaktualizowana, ale spowoduje utratę wszystkich udostępnionych preferencji, dostęp do pliku będzie niemożliwy i ....
Mimo że musisz zachować ostrożność, warunki powodują, że nowa aplikacja being considered jest aktualizacją poprzedniej aplikacji (patrz Things That Cannot Change).

Należy również zachować ostrożność w odniesieniu do kodu, może to spowodować usunięcie danych z baz danych (patrz update app with preloaded SQLite).

Ale ostatecznie, jeśli uważać, można powiedzieć:

Proces aktualizacji zastępuje tylko plik apk (a więc to, co w niej jest dla przykład kanału alfa, ...) i nie modyfikować bazy danych, sharedpreferences i inne pliki wygenerowane w czasie wykonywania (prawdopodobnie w tym przypadku , nowa aplikacja jest instalowana z UID równym UID z poprzedniej aplikacji).

Można zobaczyć te strony po więcej szczegółów:

Help!? Updating our applicatoin on the market deletes the saved SharedPreferences.
Market copy protection totally breaks file access after updating
Can someone explain the App update process?

+0

Dziękuję, wydaje mi się, że SharedPreferences POWINNO być utrzymywane w porządku. Ale czy nie ma oficjalnego opisu tego procesu? –

+0

@viperbone, które przetwarzają? Clareing sharedpreferences? Lub aktualizowanie aplikacji? – hasanghaforian

+0

Uaktualnianie procesu aplikacji. Co musi/może się stać podczas aktualizacji aplikacji. –

4

Wydaje mi się, że po ostatniej aktualizacji aplikacji przez Google Play nie miało to wpływu na właściwości sharedPreferences.
Używałem ich do automatycznego logowania, a po aktualizacji zrobiło to.
To było miesiąc temu, moja pamięć może stać się niewyraźna, więc lepiej jest wysłuchać opinii innych ludzi.

4

Po debugowania przez ponad 4 godziny i okazało się, że był zapis modelu jako ciąg przez szeregowania go . Klasa nadająca się do serializacji ma unikalny identyfikator o nazwie serialVersionUID, który jest domyślnie ustawiony w środowisku wykonawczym, a identyfikator jest również obliczany na podstawie nazwy klasy, interfejsów i nazw zmiennych. Dowiedziałem się, że zmieniłem klasę modelu, dodałem zmienną, a następnie zaktualizowałem aplikację. Ponieważ klasa jest teraz zmieniane tak nowy serialVersionUID została ustalona, ​​a tym samym na aktualizację, nie był w stanie deserializowania ciąg i tworzenia modelu i dawał java.io.InvalidClassException

jawne ustawienie serialVersionUID tego uniknąć wydanie

static final long serialVersionUID = 42L;