2012-02-09 15 views
8

Używam SharedPreferences w Androidzie. Wszystko działa świetnie w tej samej sesji.SharedPreferences nie jest trwała

Jednak po ponownym uruchomieniu aplikacji utracono wszystkie preferencje, które zostały ustawione z poprzedniej sesji .

Czy jest coś, co muszę podać, aby powiedzieć SharedPreferences, aby kręcić się przed uruchomieniem?

tworzę preferencje wywołując

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 

Potem ustawić właściwości, których autorem jest np

preferences.edit().putString(key, value); 

i dostaję go

preferences.getString(key, defaultValue); 

Dzięki, Victor

+2

czy napisałeś editor.commit()? – Richa

+1

Jeśli "Zestaw Sakiboy

Odpowiedz

26

SharedPreferences są trwałe po drugiej wznowienie, restart, myślę, że problemem jest to, że nie są popełnienia preferencje, stosowanie następujących do przechowywania wartości w preferencjach:

Preferences.Editor edit=preferences.edit(); 
edit.putString(key, value); 
edit.commit(); 
+1

'apply()' jest lepsze niż 'commit()', ponieważ umożliwia pisanie w tle. – levengli

2

To działa dla mnie proszę spróbować:

private SharedPreferences mShared; 
private Editor mEdit; 
mShared = PreferenceManager.getDefaultSharedPreferences(this); 

mEdit = mShared.edit(); 
mEdit.putString(key, value); 
mEdit.commit(); 
17

Nie jesteś prawdopodobne popełniania zmian . Ustaw właściwości, takie jak:

SharedPreferences.Editor editor = preferences.edit(); 
editor.putString(key, value); 
editor.commit(); 

Bez zatwierdzenia, że ​​pierdzisz na wietrze.

+23

+1 za pierdzenie na wietrze. – StackOverflowed

+0

To szybko narastało: D –

0

Preferencje nie zostaną zapisane do momentu ich popełnienia, tj .:

// DON'T DO THIS... See Next Example 
preferences.edit().putString(key, value); 
preferences.edit().commit(); 

EDIT: Powyższe ma subtelny błąd (z komentarzami); musisz zachować odwołanie do obiektu edytora, w przeciwnym razie powyższy przykład, który zatwierdza wartość, spowoduje utworzenie nowej instancji. Powinno być:

Preferences.Editor edit = preferences.edit(); 
edit.putString(key, value); 
edit.commit(); 

Dla porównania, z Android docs:

Zauważ, że musisz zadzwonić commit() mieć żadnych zmian można wykonać w Edytor rzeczywiście pojawiają się w SharedPreferences.

+0

Ten kod jest nieprawidłowy, ponieważ zatwierdzasz w innej instancji edytora niż ta, którą umieściłeś w String. – ffleandro

+0

@ffleandro - jeśli ten kod jest błędny, to tak samo jest z każdą inną odpowiedzią na to pytanie. –

+2

no man, widziałem wiele poprawnych odpowiedzi. Problem z twoją odpowiedzią polega na tym, że kiedy wywołujesz 'preferences.edit()' tworzysz obiekt 'SharedPreferences.Editor'. Kiedy "commit" popełniasz w innej instancji niż ta, którą nazwałeś 'putString', więc nie będzie trwała. Polecam przeczytać ponownie "dokumenty", które opublikowałeś. – ffleandro

1

aby uzyskać wartość w pref

SharedPreferences pref1 = getSharedPreferences(PREFS_NAME, 0); 
boolean silent = pref1.getString("silentMode", "..."); 

zapisać vlue użytkowania onstoe lub OnPause methds

SharedPreferences pref2 = getSharedPreferences(PREFS_NAME, 0); 
SharedPreferences.Editor editor = pref2.edit(); 
editor.putString("silentMode", "..."); 

To działa na mnie dobrze i zdrowo

1

Jeśli pracujesz nad poziomem interfejsu API?i powyżej, powinieneś używać editor.apply() zamiast editor.commit() podczas programowej modyfikacji swoich preferencji. editor.commit() został wycofany, a editor.apply() obsłuży faktyczną utrwalalność w tle, której nie robi editor.commit().

Pamiętaj, że editor.apply(), jeśli zawiedzie, robi to po cichu.

+0

To jest po prostu złe: commit() nie jest w ogóle przestarzałe. Jedyne powiadomienie w API 22: Jeśli nie zależy Ci na wartości zwracanej i używasz jej z głównego wątku aplikacji, zastanów się nad użyciem {@link #apply}. –

1

To jest kod, który działa dla mnie.

package com.example.persistence; 

import android.os.Bundle; 
import android.widget.EditText; 
import android.app.Activity; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 


public class MainActivity extends Activity { 

public static final String NOTE_PREFS="note"; 
SharedPreferences msgSettings; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    msgSettings = getSharedPreferences(NOTE_PREFS,0); 

     EditText et= (EditText)findViewById(R.id.editText1); 
     if (msgSettings.contains(NOTE_PREFS)) { 
      et.setText(msgSettings.getString(
        NOTE_PREFS, "my note")); 

    } 

} 
@Override 
protected void onPause() { 
     EditText et= (EditText)findViewById(R.id.editText1); 
     String b = et.getText().toString(); 
     Editor editor = msgSettings.edit(); 
     editor.putString(NOTE_PREFS,b); 
     editor.commit(); 
    super.onPause(); 
} 
@Override 
protected void onDestroy() { 
    EditText et= (EditText)findViewById(R.id.editText1); 
     String b = et.getText().toString(); 
     Editor editor = msgSettings.edit(); 
     editor.putString(NOTE_PREFS,b); 
     editor.commit(); 
    super.onDestroy(); 
} 

    } 
Powiązane problemy