Що буде з SharedPreferences під час оновлення програми для Android?


84

Я зберігав налаштування користувача у SharedPreferences у своєму додатку. Що станеться з SharedPreferences, коли я оновлюю програму через Google Play Store до нової версії програми?

Чи залишаться там SharedPrefernces після оновлення чи їх буде видалено?

Поки що я не знайшов відповіді в Інтернеті чи Stackoverflow (чи можу я шукати з неправильними ключовими словами?).

Чи можете ви вказати мені деякі посилання, в яких вони описують цей процес?

Редагувати: Тим часом я знайшов і іншу відповідь: поведінка SharedPreferences під час оновлення / видалення

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

Відповіді:


70

Крістіан тут каже: Ваші дані Програми залишаться, коли користувач встановлюватиме оновлення.

Але воно має бути з тим самим, 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.
Захист від копіювання ринку повністю порушує доступ до файлів після оновлення.
Хтось може пояснити процес оновлення програми?


Дякую, мені здається, що SharedPreferences СЛІДО тримати в порядку. Але чи немає офіційного опису цього процесу?
Bruno Bieri

@viperbone, який процес? обробляння спільних налаштувань? або оновлення програми?
hasanghaforian

Процес оновлення додатків. Що повинно / може статися при оновленні програми.
Bruno Bieri

@viperbone Будь ласка, перегляньте мою відповідь ще раз. Я додав більше деталей.
hasanghaforian

Ще одне зауваження: переконайтесь, що ім’я спільного уподобання є ОДИНИМ між оновленнями! У мене були різні імена між версіями, тому нова версія не підбирала збережені налаштування попередньої версії ... витрачала цілий ранок на налагодження цього ... :-(
henry000dev

7

Після налагодження понад 4 години я з’ясував, що зберігаю модель як рядок шляхом її серіалізації. Клас, що серіалізується, має унікальний ідентифікатор за назвою serialVersionUID , який встановлюється за замовчуванням під час виконання, а ідентифікатор обчислюється також за назвою класу, інтерфейсів та імен змінних. Я дізнався, що змінив клас моделі, додав змінну, а потім оновив програму. Оскільки клас зараз змінено, тому встановлено новий serialVersionUID і, отже, при оновленні, він не зміг десеріалізувати рядок і створити модель, і дав java.io.InvalidClassException

Явно встановіть serialVersionUID, щоб уникнути цієї проблеми

static final long serialVersionUID = 42L;

1
Але переконайтесь, що ваші зміни сумісні, або ви можете отримати дивні помилки.
mjaggard

5

Я думаю, що коли я минулого разу оновлював свою програму через Google Play, то загальні параметри не впливали.
Я використовував їх для автоматичного входу, і після оновлення це зробив.
Це було місяць тому, моя пам’ять могла розмитися, тому краще також почути думки інших людей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.