2012-02-09 16 views
8

私はSharedPreferencesをAndroidで使用しています。すべて同じセッションでうまくいきます。SharedPreferencesは永続的ではありません

しかし、アプリケーションを再起動すると、以前ののセッションから設定されたすべての設定が失われます。

SharedPreferencesを実行する際にハングアップするように指定する必要があることはありますか。

私はその後、私は、例えばでプロパティを設定

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 

を呼び出すことによって好みを作成しています

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

と私は試してみてくださいおかげで、 ビクター

+2

editor.commit()? – Richa

+1

'Set Sakiboy

答えて

26

SharedPreferences永続accrossのリニューアル、再起動され、私はこの問題は、あなたが好みで店舗の値に次の環境、使用することをコミットしていないと思い:

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

'apply()'はバックグラウンドで書き込みが可能なので 'commit()'よりも優れています。 – levengli

2

これは私のために働いている

preferences.getString(key, defaultValue); 

によってそれを得る:

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

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

をあなたの変更をコミットない可能性が高いです。そのようなプロパティを設定してください

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

風が吹いているとコミットしないでください。

+23

風の中で放つための+1。 – StackOverflowed

+0

すぐにエスカレートされた:D –

0

あなたがそれらをコミットするまでの好みはすなわち、保存されません。:

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

EDIT:上記は(コメント)の微妙なバグがあります。エディタオブジェクトへの参照を保持する必要があります。そうでなければ、値をコミットする上記の例は新しいインスタンスを作成します。次のようになります。参考のため

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

Android docsから:あなたは エディタで実行するすべての変更を持っているcommit()を呼び出す必要があります

注意は、実際にSharedPreferencesに表示されます。

+0

このコードは、Stringを配置したエディターインスタンスとは別のエディターインスタンスでコミットしているため、間違っています。 – ffleandro

+0

@ffleandro - このコードが間違っていると、この質問に対する他のすべての答えも間違っています。 –

+2

いいえ、私は正解をたくさん見ました。あなたの答えの問題は、 'preferences.edit()'を呼び出すときに 'SharedPreferences.Editor'オブジェクトを作成していることです。 'commit'を実行すると、' putString'と呼ばれるものとは別のインスタンスでコミットしているので、それは持続しません。あなたが投稿した 'docs'をもう一度読むことをお勧めします。 – ffleandro

1

SharedPreferences pref1 = getSharedPreferences(PREFS_NAME, 0); 
boolean silent = pref1.getString("silentMode", "..."); 
で値を取得するには onstoe vlue使用を節約するために

またはonPauseは

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

それは私のために正常に働きます。

1

APIレベル用に開発している場合は?上記の場合は、プログラムでプリファレンスを変更するときは、editor.commit()の代わりにeditor.apply()を使用する必要があります。 editor.commit()は廃止され、editor.apply()はバックグラウンドでの実際の持続性を処理しますが、editor.commit()ではこれが行われません。

editor.apply()は、それが失敗した場合、自動的に表示されます。

+0

これは間違っています:commit()はまったく廃止されていません。 API 22の唯一の注意点は次のとおりです。戻り値を気にせず、アプリケーションのメインスレッドから使​​用している場合は、代わりに#appleを使用することを検討してください。 –

1

これは私に適したコードです。

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

    } 
関連する問題