Подтвердить что ты не робот

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

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

Будет ли SharedPrefernces оставаться после обновления или они будут удалены?

До сих пор я не нашел ответа в Интернете или в Stackoverflow (могу ли я искать неверные ключевые слова?).

Можете ли вы указать мне на некоторые ссылки, которые описывают этот процесс?

Edit: Тем временем я нашел и другой ответ: поведение SharedPreferences при обновлении/удалении

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

4b9b3361

Ответ 1

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

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

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

Совершенно откровенно, потеря данных из-за обновления неприемлема.

Edit

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

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

static final long serialVersionUID = 42L;