¿Cómo usar SharedPreferences para guardar más de un valor?

Estoy desarrollando una aplicación de diccionario. En mi aplicación, supongo que el usuario quiere guardar las palabras favoritas. He decidido usar SharedPreferences para guardar estos valores (soy consciente de que SQLite y los archivos son mejores, pero estoy atascado en “SharedPreferences”, así que sigo con él).

Aquí abajo está mi código:

@Override public void onClick(View v) { SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); { SharedPreferences.Editor editor = faves.edit(); editor.putString("favourite", mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); editor.commit(); } Log.i(CONTENT_TAG,"Favourite saved!"); Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); toast.show(); } 

El problema es que no conserva más de una palabra favorita. Quiero decir que solo se guarda una palabra favorita y cuando se agrega una nueva, se borra la anterior.

Entonces, ¿cómo se puede editar el código anterior para que este problema se resuelva?

¿Pueden ayudarme? Muchas gracias.

Puede guardar varios favoritos en una sola preferencia agregando numerosos favoritos en una sola cadena, cada elemento favorito separado por comas. Luego puede usar el método convertStringToArray para convertirlo en String Array. Aquí está el código fuente completo.
Use MyUtility Methods para guardar múltiples artículos favoritos.

  MyUtility.addFavoriteItem(this, "Sports"); MyUtility.addFavoriteItem(this, "Entertainment"); 

obtener una matriz String de todos los favoritos guardados

 String[] favorites = MyUtility.getFavoriteList(this);// returns {"Sports","Entertainment"}; 

Guarde estos métodos en una clase de utilidad separada

  public abstract class MyUtility { public static boolean addFavoriteItem(Activity activity,String favoriteItem){ //Get previous favorite items String favoriteList = getStringFromPreferences(activity,null,"favorites"); // Append new Favorite item if(favoriteList!=null){ favoriteList = favoriteList+","+favoriteItem; }else{ favoriteList = favoriteItem; } // Save in Shared Preferences return putStringInPreferences(activity,favoriteList,"favorites"); } public static String[] getFavoriteList(Activity activity){ String favoriteList = getStringFromPreferences(activity,null,"favorites"); return convertStringToArray(favoriteList); } private static boolean putStringInPreferences(Activity activity,String nick,String key){ SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(key, nick); editor.commit(); return true; } private static String getStringFromPreferences(Activity activity,String defaultValue,String key){ SharedPreferences sharedPreferences = activity.getPreferences(Activity.MODE_PRIVATE); String temp = sharedPreferences.getString(key, defaultValue); return temp; } private static String[] convertStringToArray(String str){ String[] arr = str.split(","); return arr; } } 

Si tiene que agregar favoritos adicionales . A continuación, obtenga la cadena favorita de SharedPreference y agregue la coma + elemento favorito y SharedPreference nuevo en SharedPreference .
* Puede usar cualquier otra cadena para el separador en lugar de la coma.

SharedPreferences funcionan a través de una clave / valor simple, de modo que cuando proporciona un nuevo valor para la misma clave, se sobrescribe el valor anterior. La única manera de hacer lo que intenta hacer es usar diferentes claves, lo que sugiere que probablemente no debería usar las SharedPreferences para lo que está tratando de hacer.

Honeycomb agregó el método putStringSet , por lo que podría usarlo si no tiene que admitir nada menos que Honeycomb:

 @Override public void onClick(View v) { SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); { Set faveSet = faves.getStringSet("favourite"); faveSet.add(mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); SharedPreferences.Editor editor = faves.edit(); editor.putStringSet("favourite", faveSet); editor.commit(); } Log.i(CONTENT_TAG,"Favourite saved!"); Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); toast.show(); } 

Si necesita soporte para dispositivos pre-Honeycomb, tendrá que idear su propio esquema.

Una posibilidad es almacenar las palabras como valores separados por comas en una preferencia.

Otra es generar una nueva clave para cada nueva palabra, “favourite1”, “favourite2”, “favourite3” y tener otra preferencia que use para almacenar el número de palabras.

Cada vez que hace clic en el botón, guarda la palabra favorita con la clave ya presente: favorite y la anula. Para guardar más de una palabra, debes guardar las palabras con diferentes claves. Así que cada vez que guardes una palabra favorita podrías hacer:

 private static int incrementedValue = 0; ... @Override public void onClick(View v) { SharedPreferences faves = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); SharedPreferences.Editor editor = faves.edit(); editor.putString("favourite" + incrementedValue, mSelectedDB + "::" + mCurrentWordId + "::" + mCurrentWord + ","); editor.commit(); Log.i(CONTENT_TAG,"Favourite saved!"); Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); toast.show(); incrementedValue++; } 

Bueno, eso se debe a que el almacenamiento de preferencia real no es una lista de cadenas, solo una, por lo que siempre que digas putString() sobrescribes el valor anterior. Una buena forma de almacenar múltiples objetos en una sola cadena de preferencias es usar JSON. Simplemente serialice el valor y luego escríbalo. También tiene el beneficio de convertir directamente a un objeto de la complejidad que desee. Busca usar Jackson si decides seguir esta ruta.

Podría usar un TreeMap (u otro tipo de lista que implemente Serializable). Así es como manejé una lista de favoritos recientemente. En TreeMap, Favorite es una clase que uso. En su caso, podría usar TreeMap en su lugar.

 private static TreeMap favourites; ... ... ... // load favourites FileInputStream fis=null; ObjectInputStream ois = null; try { fis = context.openFileInput(context.getString(R.string.favourites_file)); try { ois = new ObjectInputStream(fis); favourites = (TreeMap) ois.readObject(); } catch (StreamCorruptedException e) { } catch (IOException e) { } catch (ClassNotFoundException e) { } } catch (FileNotFoundException e) { } finally { try { if (ois!=null){ ois.close(); } } catch (IOException e) { } } if (favourites==null){ favourites = new TreeMap(); } ... ... ... // save favourites FileOutputStream fos=null; ObjectOutputStream oos=null; try { fos = context.openFileOutput(context.getString(R.string.favourites_file), MODE_PRIVATE); try { oos = new ObjectOutputStream(fos); oos.writeObject(favourites); } catch (IOException e) { } } catch (FileNotFoundException e) { } finally { if (oos!=null){ try { oos.close(); } catch (Exception e2) { } } } 

También puede evitar la acción “::” que está haciendo para separar los valores.

Espero que ayude…