Co się stanie ze SharedPreferences po aktualizacji aplikacji na Androida?

84

Zapisałem ustawienia użytkownika w SharedPreferences w mojej aplikacji. Co się stanie ze SharedPreferences, kiedy zaktualizuję aplikację za pośrednictwem sklepu Google Play do nowej wersji aplikacji?

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

Jak dotąd nie znalazłem odpowiedzi w Internecie ani w Stackoverflow (czy mogę wyszukiwać z niewłaściwymi słowami kluczowymi?).

Czy możesz wskazać mi linki opisujące ten proces?

Edycja: W międzyczasie znalazłem też inną odpowiedź: zachowanie SharedPreferences przy aktualizacji / odinstalowaniu

Edycja 2: Od czasu, gdy po raz pierwszy zadałem to pytanie, niedawno dowiedziałem się, że od wersji Androida 6.0 (API 23) można również korzystać z funkcji automatycznego tworzenia kopii zapasowych, aby zabezpieczyć wspólne preferencje, zgodnie z opisem Google tutaj . Po prostu dodaj allowBackup="true"w swoim AndroidManifest.xmlpliku.

Bruno Bieri
źródło

Odpowiedzi:

70

Cristian tutaj mówi: dane Zastosowanie będą pozostawać gdy użytkownik zainstalować aktualizacje.

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

EboMike w Ostrzeżenie użytkownika Androida, że ​​aktualizacja aplikacji może prowadzić do utraty danych ze starej wersji aplikacji? mówi:

Szczerze mówiąc, utrata danych z powodu aktualizacji jest niedopuszczalna.

Edycja :

Zwykle SharedPreferences (jak również inne dane użytkownika) zostaną zachowane podczas procesu aktualizacji, ale czasami, z powodu jakiegoś „ nieznanego ” problemu, dane mogą zostać utracone i myślę, że jest to poza twoją kontrolą. Możesz więc po prostu uwierzyć, że SharedPreferences zostaną zachowane ( patrz tutaj ).

Tak więc, jeśli chcesz uniknąć usuwania danych użytkownika w trakcie aktualizacji, musisz zapisać główne dane w pamięci zewnętrznej (może to być wymienny nośnik pamięci, taki jak karta SD lub wewnętrzna, niewymienna pamięć masowa), a nie prywatna dla Twojej aplikacji lub przynajmniej odłóż, aby użytkownik mógł wykonać kopię zapasową danych przed aktualizacją. Następnie podczas pierwszego uruchomienia (zaktualizowanej) aplikacji sprawdź, czy jest jakiś plik kopii zapasowej w pamięci zewnętrznej, czy nie.

Jeśli chcesz wiedzieć, jakie rzeczy muszą / mogą się wydarzyć podczas aktualizacji aplikacji? , Ja nie każdy opis dobre dla this.It jest skomplikowane i względne z Android Security, Application signing, copy protectioni inne topics.I znaczy, że jeśli zmieni stan swojej aplikacji w dowolnych powyższych dziedzinach, powoduje inny wynik.
Na przykład jeśli Ty CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, Twoja aplikacja zostanie zaktualizowana, ale spowoduje utratę wszystkich wspólnych preferencji, dostęp do plików będzie niemożliwy i ....
Chociaż musisz uważać na warunki, twoja nowa aplikacja being consideredjest aktualizacją poprzedniej aplikacji (patrz Rzeczy, których nie można zmienić ).

Musisz również uważać na swój kod, może to być spowodowane usunięciem danych z twoich baz danych (patrz aktualizacja aplikacji z wstępnie załadowanym SQLite ).

Ale ostatecznie, jeśli zachowasz ostrożność, możesz powiedzieć:

Proces aktualizacji zastępuje tylko plik apk (a więc to, co w nim jest, na przykład elementy rysunkowe, ...) i nie zmienia baz danych, wspólnych preferencji ani żadnych innych plików, które zostały wygenerowane w czasie wykonywania (prawdopodobnie w tym przypadku nowa aplikacja jest instalowana z UID, który jest równy UID poprzedniej aplikacji).

Więcej informacji można znaleźć na tych stronach:

Wsparcie!? Aktualizacja naszej aplikacji na rynku powoduje usunięcie zapisanych SharedPreferences.
Rynkowa ochrona przed kopiowaniem całkowicie blokuje dostęp do plików po aktualizacji.
Czy ktoś może wyjaśnić proces aktualizacji aplikacji?

hasanghaforian
źródło
Dzięki, wydaje mi się, że SharedPreferences POWINIEN być utrzymany w porządku. Ale czy nie ma oficjalnego opisu tego procesu?
Bruno Bieri
@viperbone, który przetwarza? clareing sharedpreferences? lub aktualizację aplikacji?
hasanghaforian
Proces uaktualniania aplikacji. Co musi / może się wydarzyć podczas aktualizacji aplikacji.
Bruno Bieri,
@viperbone Proszę zobaczyć moją odpowiedź ponownie.Dodałem więcej szczegółów.
hasanghaforian
Kolejna uwaga: upewnij się, że nazwa wspólnych preferencji jest TAKA SAMA między aktualizacjami! Miałem różne nazwy między wersjami, więc nowa wersja nie odbierała zapisanych preferencji z poprzedniej wersji ... zmarnowałem cały poranek na debugowanie tego ... :-(
henry000dev
7

Po debugowaniu przez ponad 4 godziny dowiedziałem się, że zapisuję model jako ciąg poprzez serializację. Klasa możliwa do serializacji ma unikatowy identyfikator według nazwy serialVersionUID , który jest ustawiany domyślnie w czasie wykonywania, a identyfikator jest 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 zmieniona, więc ustawiono nowy serialVersionUID, a tym samym podczas aktualizacji, nie był w stanie deserializować ciągu i utworzyć modelu i podawał java.io.InvalidClassException

Jawnie ustaw serialVersionUID, aby uniknąć tego problemu

static final long serialVersionUID = 42L;
abhishek
źródło
1
Ale upewnij się, że twoje zmiany są zgodne, w przeciwnym razie możesz uzyskać dziwne błędy.
mjaggard
5

Myślę, że kiedy ostatnio zaktualizowałem moją aplikację przez Google Play, nie miało to wpływu na SharedPreferences.
Używałem ich do automatycznego logowania, a po aktualizacji tak się stało.
To było miesiąc temu, moja pamięć mogła się rozmyć, więc lepiej posłuchać opinii innych.

Lazy Ninja
źródło