Что произойдет с SharedPreferences при обновлении приложения для Android?

86

Я сохранил пользовательские настройки в SharedPreferences своего приложения. Что произойдет с SharedPreferences, когда я обновлю приложение через Google Play Store до новой версии приложения?

Сохранятся ли SharedPrefernces после обновления или они будут удалены?

Пока я не нашел ответа в Интернете или на Stackoverflow.

Не могли бы вы указать мне ссылки, в которых описывается этот процесс?

Изменить: Между тем я нашел и другой ответ: поведение SharedPreferences при обновлении / удалении

Изменить 2: Прошло довольно много времени, когда я впервые задал этот вопрос, я недавно узнал, что с Android 6.0 (API 23) также можно использовать функцию автоматического резервного копирования для защиты общих настроек, как описано здесь Google .

Просто добавьте allowBackup="true"в свой AndroidManifest.xmlфайл.

Бруно Бьери
источник

Ответы:

72

Cristian здесь говорит: ваши данные приложения будет оставаться при установке обновлений пользователя.

Но он должен быть таким же, package nameчтобы обнаруживать обновление предыдущего приложения.

EboMike предупреждает пользователя Android, что обновление приложения может привести к потере данных из старой версии приложения? говорит:

Откровенно говоря, потеря данных из-за обновления недопустима.

Редактировать :

Обычно SharedPreferences (как и другие пользовательские данные) сохраняются во время процесса обновления, но иногда из-за какой-то « неизвестной » проблемы данные могут быть потеряны, и я думаю, это вне вашего контроля. Итак, вы можете просто поверить, что SharedPreferences будут сохранены ( см. Здесь ).

Итак, если вы хотите избежать очистки данных пользователя в процессе обновления, вам необходимо сохранить основные данные во внешнем хранилище (это может быть съемный носитель, например, SD-карта, или внутреннее несъемное хранилище), а не закрыто для вашего приложения. Или, по крайней мере, отложите, чтобы пользователь мог сделать резервную копию данных перед обновлением. Затем при первом запуске вашего (обновленного) приложения проверьте, есть ли файл резервной копии во внешнем хранилище или нет.

Если вы хотите знать, что должно / может произойти при обновлении приложения? Я не сделал любое описание хорошо для this.It осложняется и относительной с Android Security, Application signing, copy protectionи другие topics.I означает , что если вы измените состояние вашего приложения в любых указанных выше областях, это вызывает другой результат.
Например, если вы CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, ваше приложение будет обновлено, но все ваши общие настройки будут потеряны, доступ к файлам будет невозможен и ...
Хотя вы должны быть осторожны в условиях, потому что ваше новое приложение being consideredявляется обновлением для предыдущего приложения (см. Вещи, которые не могут измениться ).

Также вы должны позаботиться о своем коде, это может быть вызвано удалением данных ваших баз данных (см. Приложение для обновления с предварительно загруженным SQLite ).

Но в конечном итоге, если быть осторожным, можно сказать:

Процесс обновления заменяет только файл apk (и то, что в нем, например, чертежи, ...), и не изменяет базы данных, общие настройки и любые другие файлы, созданные во время выполнения (вероятно, в этом случае новое приложение устанавливается с UID, равный UID предыдущего приложения).

Вы можете увидеть эти страницы для более подробной информации:

Помогите!? Обновление нашего приложения на рынке удаляет сохраненные SharedPreferences.
Защита от копирования Market полностью закрывает доступ к файлам после обновления.
Может кто-нибудь объяснить процесс обновления приложения?

Hasanghaforian
источник
Спасибо, мне кажется, что SharedPreferences СЛЕДУЕТ сохранить в порядке. Но разве нет официального описания этого процесса?
Бруно Бьери
@viperbone какой процесс? определение общих настроек? или обновление приложения?
hasanghaforian
Процесс обновления приложений. Что должно / может произойти при обновлении приложения.
Bruno Bieri
@viperbone Пожалуйста, посмотрите мой ответ еще раз. Я добавил подробности.
hasanghaforian
Еще одно примечание: убедитесь, что имя общего предпочтения ОДИНАКОВО ОДНО между обновлениями! У меня были разные имена между версиями, поэтому новая версия не собирала сохраненные настройки из предыдущей версии ... потратила все утро на отладку ... :-(
henrykodev
7

После более чем 4-часовой отладки я обнаружил, что сохраняю модель как строку, сериализуя ее. Сериализуемый класс имеет уникальный идентификатор по имени serialVersionUID , который устанавливается по умолчанию во время выполнения, и идентификатор также вычисляется по имени класса, интерфейсов и имен переменных. Я узнал, что изменил класс модели, добавил переменную, а затем обновил приложение. Поскольку класс теперь изменен, поэтому был установлен новый serialVersionUID и, следовательно, при обновлении он не смог десериализовать строку и создать модель и выдавал исключение java.io.InvalidClassException

Явно установите serialVersionUID, чтобы избежать этой проблемы

static final long serialVersionUID = 42L;
абхишек
источник
1
Но убедитесь, что ваши изменения совместимы, иначе вы можете получить странные ошибки.
mjaggard
5

Думаю, когда я последний раз обновлял свое приложение через Google Play, на sharedPreferences это не повлияло.
Я использовал их для автоматического входа в систему, и после обновления он это сделал.
Это было месяц назад, моя память могла стать нечеткой, так что лучше прислушиваться и к мнению других людей.

Ленивый ниндзя
источник