java - preferencias - sharedpreferences android studio ejemplo
Android: ¿es una mala práctica tener múltiples preferencias compartidas? (3)
Tengo una aplicación que hace uso de SharedPreferences
. Uno solo almacena la versión de la aplicación para verificar la actualización de un registro de cambios, el otro contiene cierta información de diseño que se puede llamar a clear()
cuando el usuario elige. Finalmente logré que funcionara un PreferenceFragment
y noté una tendencia, así que pensé que podría preguntarle esto ahora antes de que me vuelva loco de preferencia (aunque creo que tengo suficiente).
He hecho mi mejor esfuerzo para buscar y no ver ninguna mención específica de un problema, solo que es posible tener múltiples.
Estoy un poco preocupado por el hecho de que PreferenceManager.getDefaultSharedPreferences()
agarra las PreferenceManager.getDefaultSharedPreferences()
incorrectas, pero simplemente podría estar entendiendo mal el uso.
El único código relevante que pude pensar de mi actividad:
SharedPreferences storedVer = getSharedPreferences(VER_NUM, 0);
SharedPreferences savedLayout = getSharedPreferences(LAYOUT_SAVE, 0);
De mi experiencia con las SharedPreferences
he notado lo siguiente:
1) Utilice siempre el intento de hacer que su nombre SharedPreference
y Atributos sean únicos en todo el dispositivo.
2) No use el nombre de su SharedPreference
como "myPreference", "preferences", "appPreference" ... etc. Use su PackageName
como un identificador único para el nombre SharedPreference
.
Ejemplo:
SharedPreferences preferences = getSharedPreferences(Context.getPackageName(), Context.MODE_PRIVATE);
3) Utilice también claves únicas para sus atributos al concatenar el nombre del atributo con el nombre del paquete.
Ejemplo:
Editor editor = sharedpreferences.edit();
boolean isAdminKey = Context.getPackageName()+"admin";
editor.putString(isAdminKey , "value");
editor.commit();
4) No hay problema con la edición de múltiples valores de claves con un solo commit()
.
5) Use MODE_PRIVATE
cuando cree sus preferencias para evitar que otras aplicaciones lean sus SharedPreferences
. Vea el paso 2 por ejemplo
6) No confíe en SharedPreferences
100% porque se borrará si el usuario presionó el botón Clear Data
en la pantalla de información de la aplicación. De lo contrario, cree un archivo en el directorio ExternalDirectory()
o envíe su información a un servidor.
No es una mala práctica en absoluto. Creo que es lo contrario. Creo que diferentes comportamientos deberían usar diferentes archivos sharedPreference
.
.getDefaultSharedPreferences()
usa el archivo com.company.packagename.xml
predeterminado. Y los demás crean sus propios archivos.
Las siguientes ventajas de usar múltiples sharedPreference''s
surgen en mi mente.
- Cuando utiliza BackupManager, puede proporcionar qué archivos
sharedPreference
para hacer una copia de seguridad y restaurar. - Cuando el usuario
sharedPreference
la sesión, puede eliminar el archivosharedPreference
con los valores privados de ese usuario. Es posible que no desee eliminar algunos otros.
Tarde a la fiesta pero yo diría que no use múltiples preferencias . Quédate con getDefaultSharedPreferences
. He visto que muchos no logran realizar un seguimiento de los nombres de las preferencias guardadas. En general, hace que el código sea más complicado de la manera incorrecta (el compilador no puede ayudarlo a administrar sus nombres). Además, las preferencias compartidas son para un puñado de pequeños valores: use el sistema de archivos para grandes cosas y una base de datos para una gran cantidad de datos.
He visto que las preferencias compartidas nombradas se usan mucho y creo que esta es una tendencia desafortunada propagada por copyPaste()
.
Finalmente, sus actividades preferidas escriben sobre las preferencias compartidas predeterminadas (recientemente respondí una pregunta en la que se trató este problema) se evitarían por completo si se usaran las preferencias predeterminadas. Ver: Android SharedPreferences no cambia
Podría considerar envolver los métodos predeterminados de preferencias compartidas para hacerlos aún más detallados como lo he hecho here