Set<Cadena> en android sharedpreferences no guardar en la fuerza de cierre

Estoy tratando de utilizar los androides sharedpreferences, He conectado todo y el código de abajo realmente se compromete el conjunto de cuerdas. El problema es cuando me fuerza cierre la aplicación y comenzar de nuevo, de la configuración.getStringSet devuelve un conjunto vacío. No errormessages en cualquier lugar.

He intentado PreferenceManager.getDefaultSharedPreferences pero eso no funciona para mí.

Gracias por tu tiempo.

public static final String PREFS_NAME = "MyPrefsFile";
private static final String FOLLOWED_ROUTES = "followedRoutes";

y más tarde cuando el guarda se llama:

public void onFollowClicked(View view){

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();

Set<String> follows =  settings.getStringSet(FOLLOWED_ROUTES, new HashSet<String>());
follows.add(routeId);

editor.putStringSet(FOLLOWED_ROUTES, follows);
editor.commit();

}
  • ¿cuál es el problema?
  • Hacer que se respete el ciclo de vida? En que estado de guardar los datos?
  • todo está guardado antes de salir de fuerza. el problema es que la configuración.getStringSet(… no devuelve los valores que me hiciste a ella. He intentado también la sustitución de commit() para aplicar() – sin éxito
InformationsquelleAutor Malin | 2013-07-04

2 Kommentare

  1. 19

    Echar un vistazo aquí.

    También para refference:

    SharedPreferences

    SharedPreferences.Editor

    EDICIÓN:

    De hecho, hay un bug con este, a ver aquí. Un extracto de lo que hay:

    Este problema es todavía presente en el 17 nivel de API.

    Es causada debido a la getStringSet() método de la
    La clase SharedPreferences no devuelve una copia del objeto de Conjunto: se
    devuelve el objeto en su totalidad y, al agregar nuevos elementos a, la
    commitToMemory método de la SharedPrefencesImpl.EditorImpl clase a ver
    que el valor es igual al valor anterior almacenado.

    Las formas de solucionar este problema es hacer una copia de la
    devuelto por SharedPreferences.getStringSet o la fuerza de la escritura
    la memoria usando otra preferencia que siempre cambian (por ejemplo, un
    propiedad que almacena el tamaño del conjunto cada vez)

    EDIT2:

    Podría ser una solución aquí, echar un vistazo.

    • No se puede crear una instancia del Conjunto de tipo<Cadena>, desde entonces es simplemente una interfaz
    • Sólo una pregunta, ¿cuál es tu minSDK en el AndroidManifest?
    • funciona bien si uso una cadena, pero no un stringSet, y que es lo que necesito. He intentado también: HashSet<Cadena> siguiente = (HashSet<Cadena>) configuración.getStringSet(FOLLOWED_ROUTES, new HashSet<Cadena>());
    • He editado mi respuesta. Hay un bug con este uso y han proporcionado una solución, o algo así ..
    • La solución, como siempre en su enlace here funcionó! Como usted dijo, esto es un error. getStringSet() método de la SharedPreferences no devuelve una copia del objeto de Conjunto. El uso de JSONArray en combinación con el getString() se cómo he resuelto el problema
    • Voy a editar la respuesta, porque es parcialmente defectuoso.
    • Su respuesta es correcta. Yo estaba tratando de guardar el Conjunto<Cadena> en SharedPrefrences y no fue guardando en todo o guardar después de algún tiempo y NO al instante – a pesar de utilizar sharedPreferences.edit().putStringSet("favs", set).commit(); en Lugar de guardar «set» terminé de ahorro de set = new HashSet<>(set);, que resolvió el problema
    • Hacer una copia de la que el retorno y guardar la copia a resolver el problema!!!

  2. 32

    También puede evitar el error mencionado por g00dy de esta manera:

    Obtener el conjunto de sharedPreferences y guardarlo en una variable.

    A continuación, elimine el conjunto de sharedpreferences antes de agregar de nuevo al ahorro.

    SharedPreferences.Editor editor= sharedPref.edit();
    editor.remove("mSet");
    editor.apply(); 
    editor.putStringSet("mSet", mSet);
    editor.apply();

    Asegúrese de utilizar apply() o commit() dos veces.

    Alternativamente, si usted está trabajando en Kotlin simplemente :

    PreferenceManager.getDefaultSharedPreferences(applicationContext)
        .edit {
            this.remove("mSet")
            this.apply()
            this.putStringSet("mSet", mSet)
        }
    • Esto salvó mi vida, deseo que era mejor documentados.
    • Muchas gracias yo pensaba que me estaba volviendo loco. Android por favor arreglar esto o, al menos, documento que es un problema! Gracias
    • OMG impresionante arreglar ! Me estaba empezando a dar
    • Impresionante respuesta, muchas gracias m8!!
    • Debe ser aceptado respuesta. Esto salvar mi día!. Gracias!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea