2012-08-22 7 views
33

Come dice il titolo, voglio salvare e recuperare determinate stringhe. Ma il mio codice non passerà attraverso la prima riga né in recupero né in archivio. Ho cercato di seguire questo link: http://developer.android.com/guide/topics/data/data-storage.htmlAndroid: memorizzazione/recupero di stringhe con preferenze condivise

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(); 
} 

e il mio metodo di recuperare:

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 è un array di stringhe statica. PREFS_NAME è

public static final String PREFS_NAME = "MyPrefsFile"; 
+0

Guarda questo. http://stackoverflow.com/a/11894634/614807 –

+0

C'è una bella [libreria] (https://github.com/frankiesardo/icepick) che ti fa risparmiare qualche boilercode, se si memorizzano e si ripristinano i valori in una sola particolare attività – Templum

risposta

3

Ho risolto! Non ha funzionato quando ho chiamato i metodi all'interno della classe! Ho dovuto chiamarlo da un'altra classe per qualche motivo e scrivere "nomignolo.questo" come parametro di contesto. Ecco il finale di lavoro:

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

provare con contesto:

final SharedPreferences settings = context.getSharedPreferences(
      PREFS_NAME, 0); 

return settings.getString(key, null); 
+0

sembra funzionare per la parte di recupero, ma è piuttosto difficile da sapere perché non ho memorizzato nulla. ancora problemi con lo storage-part. grazie per questo però! – Rad

68

Per salvare le preferenze:

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

Per ottenere una preferenza memorizzata:

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

Dove context è la vostra Contesto.


Se si ottengono più valori, può essere più efficiente riutilizzare la stessa istanza.

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

E se si sta salvando più valori:

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

Nota: Salvataggio con apply() è meglio che usare commit(). L'unica volta che hai bisogno di commit() è se hai bisogno del valore di ritorno, che è molto raro.

+1

@dinosaur Probabilmente è possibile sostituire 'context' con' getBaseContext() 'o metodi simili se all'interno di un'attività. Se sei all'interno di una classe di oggetti, probabilmente lo hai inizializzato con il parametro 'content', in cui puoi dichiararlo come una variabile globale alla creazione e usarlo qui. – Doomsknight

+0

Hmm. Apparentemente c'è qualcosa che non sto ottenendo. Ho provato a scrivere: PreferenceManager.getDefaultSharedPreferences (getBaseContext()). Edit(). PutString (tal, pathtilsave). Com(); e ho provato a cambiare il mio metodo in: private void savepath (contesto contesto, stringa pathtilsave, int i) con il contesto che è "questo" come parametro. Ancora non funziona. Farlo male? – Rad

+0

@dinosaur Quanto lontano arriva? Sei sicuro che questo 'pathtilsave' non è nullo? Prova a codificare le variabili come nel mio esempio e verifica se funziona. Se lo fa, deve essere i tuoi parametri. – Doomsknight

6
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"); 
} 
+0

'SharedPreferences settings = c.getSharedPreferences (PREFS_NAME, 0); settings = c.getSharedPreferences (PREFS_NAME, 0); ' La seconda riga non è ridondante? BTW, l'ho modificato ora – eRaisedToX

+0

@eRaisedToX hai assolutamente ragione. La tua modifica è stata in qualche modo respinta, quindi sono andato avanti e ho modificato la risposta da solo, apportando ulteriori miglioramenti. –

0

La classe SharedPreferences consente di salvare le preferenze specifiche per un'applicazione Android.

API versione 11 ha introdotto i metodi putStringSet e getStringSet che consente allo sviluppatore di memorizzare un elenco di valori stringa e recuperare un elenco di valori stringa, rispettivamente.

Un esempio di memorizzazione di un array di stringhe utilizzando SharedPreferences può essere fatto in questo modo:

// Get the current list. 

SharedPreferences settings = this.getSharedPreferences("YourActivityPreferences", Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = settings.edit(); 
Set<String> myStrings = settings.getStringSet("myStrings", new HashSet<String>()); 

// Add the new value. 

myStrings.add("Another string"); 


// Save the list. 
editor.putStringSet("myStrings", myStrings); editor.commit(); 
+0

come poi lo si imposta su Textview usando setText(); ?? –

3

Se non si preoccupano il valore di ritorno di commit() uso migliore applicare(), in quanto essendo asincrono è più veloce di commit().

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

Secondo docs

differenza commit(), che scrive le sue preferenze ad memoria persistente sincrono, applicare() impegna le modifiche ai SharedPreferences in memoria immediatamente ma avvia un asincrono impegnano a disco e non ti verrà notificato alcun errore. Se un altro editor su questo SharedPreferences esegue un commit() regolare mentre apply() è ancora in sospeso, il commit() verrà bloccato fino a quando non saranno completati tutti i commit asincroni e anche il commit stesso.