Android: almacenamiento / recuperación de cadenas con preferencias compartidas

Como dice el título, quiero guardar y recuperar ciertas cadenas. Pero mi código no pasará por la primera línea ni en la recuperación ni en la tienda. Traté de seguir este enlace: http://developer.android.com/guide/topics/data/data-storage.html

private void savepath(String pathtilsave, int i) { String tal = null; // doesn't go past the line below SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); tal = String.valueOf(i); editor.putString(tal, pathtilsave); editor.commit(); } 

y mi método de recuperación:

 public void getpaths() { String tal = null; // doesn't go past the line below SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); for (int i = 1; i <= lydliste.length - 1; i++) { tal = String.valueOf(i); String restoredText = settings.getString(tal, null); if (restoredText != null) { lydliste[i] = restoredText; } } } 

lydliste es una matriz de cuerdas estática. PREFS_NAME es

 public static final String PREFS_NAME = "MyPrefsFile"; 

Para guardar en las preferencias:

 PreferenceManager.getDefaultSharedPreferences(context).edit().putString("MYLABEL", "myStringToSave").apply(); 

Para obtener una preferencia almacenada:

 PreferenceManager.getDefaultSharedPreferences(context).getString("MYLABEL", "defaultStringIfNothingFound"); 

Donde el context es tu contexto.


Si está obteniendo valores múltiples, puede ser más eficiente reutilizar la misma instancia.

  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String myStrValue = prefs.getString("MYSTRLABEL", "defaultStringIfNothingFound"); Boolean myBoolValue = prefs.getBoolean("MYBOOLLABEL", false); int myIntValue = prefs.getInt("MYINTLABEL", 1); 

Y si está guardando múltiples valores:

 Editor prefEditor = PreferenceManager.getDefaultSharedPreferences(context).edit(); prefEditor.putString("MYSTRLABEL", "myStringToSave"); prefEditor.putBoolean("MYBOOLLABEL", true); prefEditor.putInt("MYINTLABEL", 99); prefEditor.apply(); 

Nota: Guardar con apply() es mejor que usar commit() . La única vez que necesita commit() es si necesita el valor de retorno, que es muy raro.

 private static final String PREFS_NAME = "preferenceName"; public static boolean setPreference(Context context, String key, String value) { SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putString(key, value); return editor.commit(); } public static String getPreference(Context context, String key) { SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); return settings.getString(key, "defaultValue"); } 

¡Lo resolví! ¡No funcionó cuando llamé a los métodos desde dentro de la clase! Tuve que llamarlo desde otra clase por alguna razón, y escribir “classname.this” como parámetro Context. Aquí está el trabajo final:

 SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, 0); settings = ctx.getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putString(tal, pathtilsave); editor.commit(); 

Si no le importa el valor de retorno de commit () use mejor apply () ya que es asincrónico y es más rápido que commit () .

 final SharedPreferences prefs = context.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("key", "value"); editor.apply(); 

Según los documentos

A diferencia de commit (), que escribe sus preferencias en el almacenamiento persistente de forma síncrona, apply () confirma sus cambios en las Preferencias Compartidas en memoria de inmediato, pero inicia una confirmación asincrónica en el disco y no se le notificará ninguna falla. Si otro editor en esta SharedPreferences realiza una confirmación regular () mientras que una solicitud () aún está pendiente, la confirmación () se bloqueará hasta que se completen todas las confirmaciones asincrónicas, así como la confirmación misma.

Pruébalo con contexto:

 final SharedPreferences settings = context.getSharedPreferences( PREFS_NAME, 0); return settings.getString(key, null); 

La clase SharedPreferences le permite guardar preferencias específicas para una aplicación de Android.

La versión 11 de API introdujo los métodos putStringSet y getStringSet, que le permiten al desarrollador almacenar una lista de valores de cadena y recuperar una lista de valores de cadena, respectivamente.

Un ejemplo de almacenamiento de una matriz de cadenas utilizando SharedPreferences se puede hacer así:

 // Get the current list. SharedPreferences settings = this.getSharedPreferences("YourActivityPreferences", Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); Set myStrings = settings.getStringSet("myStrings", new HashSet()); // Add the new value. myStrings.add("Another string"); // Save the list. editor.putStringSet("myStrings", myStrings); editor.commit(); 

Pasos simples para guardar una cadena con SharedPreferences:

la clase pública MainActivity extiende AppCompatActivity {

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences prefs = this.getSharedPreferences("com.example.nec.myapplication", Context.MODE_PRIVATE); prefs.edit().putString("userName", "NEC").apply(); String name = prefs.getString("userName", ""); Log.i("saved string", name); }