¿Qué pasará con las preferencias compartidas al actualizar una aplicación de Android?

84

He almacenado la configuración del usuario en SharedPreferences en mi aplicación. ¿Qué pasará con SharedPreferences cuando actualice la aplicación a través de Google Play Store a una nueva versión de la aplicación?

¿Las preferencias compartidas seguirán estando allí después de la actualización o se eliminarán?

Hasta ahora no he encontrado una respuesta en la web o Stackoverflow (¿puedo buscar con palabras clave incorrectas?).

¿Puedes señalarme algunos enlaces que describen este proceso?

Editar: Mientras tanto, también encontré otra respuesta: comportamiento de SharedPreferences en Actualizar / Desinstalar

Edición 2: Desde hace bastante tiempo cuando hice esta pregunta por primera vez, aprendí recientemente que desde Android 6.0 (API 23) también es posible usar la función de copia de seguridad automática para proteger sus preferencias compartidas como lo describe Google aquí . Simplemente agregue el allowBackup="true"en su AndroidManifest.xmlarchivo.

Bruno Bieri
fuente

Respuestas:

70

Cristian dice aquí : los datos de su aplicación permanecerán cuando el usuario instale las actualizaciones.

Pero debe ser con el mismo package namepara detectar como actualización de App anterior.

EboMike en advertencia al usuario de Android de que la actualización de la aplicación podría provocar la pérdida de datos de la versión anterior de la aplicación. dice:

Francamente, la pérdida de datos debido a una actualización es inaceptable.

Editar :

Normalmente , las SharedPreferences (así como otros datos del usuario) se mantendrán durante el proceso de actualización, pero a veces, debido a algún problema " desconocido ", los datos se pueden perder y supongo que están fuera de su control. Por lo tanto, simplemente puede creer que las SharedPreferences se mantendrán ( consulte aquí ).

Por lo tanto, si desea evitar borrar los datos del usuario en el progreso de la actualización, debe guardar los datos principales en un almacenamiento externo (esto puede ser un medio de almacenamiento extraíble, como una tarjeta SD o un almacenamiento interno, no extraíble) y no privado para su aplicación. O al menos guardarlo para que el usuario haga una copia de seguridad de los datos antes de actualizar. Luego, en la primera ejecución de su aplicación (actualizada), verifique que haya algún archivo de copia de seguridad en el almacenamiento externo o no.

Si desea saber ¿Qué cosas deben o pueden suceder al actualizar una aplicación? , No lo hice ninguna descripción bueno para this.It es complicado y en relación con Android Security, Application signing, copy protectiony otra topics.I significa que si cambia el estado de su aplicación en los campos anteriores, provoca resultado diferente.
Por ejemplo, si usted CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON, su aplicación se actualizará pero hace que todas sus preferencias compartidas se pierdan, el acceso a archivos sea imposible y ...
Aunque debe tener cuidado con las condiciones que causan su nueva aplicación being consideredcomo una actualización de la aplicación anterior (consulte Cosas que no pueden cambiar ).

Además, debe tener cuidado con su código, ya que puede eliminar datos de sus bases de datos (consulte la aplicación de actualización con SQLite precargado ).

Pero en última instancia, si tiene cuidado, puede decir:

El proceso de actualización solo reemplaza el archivo apk (y, por lo tanto, lo que contiene, por ejemplo, dibujables, ...) y no altera las bases de datos, las preferencias compartidas y cualquier otro archivo generado en tiempo de ejecución (probablemente en este caso, la nueva aplicación se instala el UID que es igual al UID de la aplicación anterior).

Puede ver estas páginas para obtener más detalles:

¿¡Ayuda!? La actualización de nuestra aplicación en el mercado elimina las Preferencias compartidas guardadas.
La protección de copia de Market rompe totalmente el acceso a los archivos después de la actualización.
¿Alguien puede explicar el proceso de actualización de la aplicación?

hasanghaforian
fuente
Gracias, me parece que las SharedPreferences DEBEN mantenerse correctas. ¿Pero no hay una descripción oficial de este proceso?
Bruno Bieri
@viperbone ¿Qué proceso? ¿Clareing sharedpreferences? o actualización de la aplicación?
hasanghaforian
Proceso de actualización de aplicaciones. Qué cosas deben / pueden suceder al actualizar una aplicación.
Bruno Bieri
@viperbone Por favor, vea mi respuesta nuevamente. Agregué más detalles.
hasanghaforian
Otra nota: ¡asegúrese de que el nombre de preferencia compartida sea el MISMO entre actualizaciones! Tenía diferentes nombres entre versiones, por lo que la nueva versión no recogía las preferencias guardadas de la versión anterior ... desperdicié una mañana entera para depurar esto ... :-(
henry000dev
7

Después de depurar durante más de 4 horas, descubrí que estaba guardando un modelo como cadena al serializarlo. Una clase serializable tiene una identificación única por nombre serialVersionUID , que se establece de forma predeterminada en tiempo de ejecución y la identificación se calcula por el nombre de la clase, interfaces y los nombres de las variables también. Descubrí que cambié la clase del modelo, agregué una variable y luego actualicé la aplicación. Dado que la clase ahora se cambió, por lo que se estableció un nuevo serialVersionUID y, por lo tanto, en la actualización, no pudo deserializar la cadena y crear el modelo y estaba dando java.io.InvalidClassException

Establezca explícitamente serialVersionUID para evitar este problema

static final long serialVersionUID = 42L;
abhishek
fuente
1
Pero asegúrese de que sus cambios sean compatibles o podría tener errores extraños.
mjaggard
5

Creo que cuando actualicé mi aplicación la última vez a través de Google Play, las preferencias compartidas no se vieron afectadas.
Los estaba usando para iniciar sesión automáticamente, y después de la actualización lo hizo.
Hace un mes, mi memoria podía volverse borrosa, así que es mejor escuchar las opiniones de otras personas también.

Ninja perezoso
fuente