2012-02-09 3 views
8

Android에서 동일한 SharedPreferences을 사용하고 있습니다. 모든 항목이 동일한 세션에서 훌륭하게 작동합니다.SharedPreferences persistent 아니요

그러나 일단 응용 프로그램을 다시 실행하면 이전 세션에서 설정 한 모든 기본 설정이 손실됩니다.

SharedPreferences을 실행 대기 상태로 응답하도록 지정해야 할 것이 있습니까? 내가

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 

를 호출하여 환경을 만드는 오전

은 그럼 예에 의한 속성을 설정

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

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

editor.commit()을 작성 했습니까? – Richa

+1

'Set Sakiboy

답변

26

된 SharedPreferences는 지속적으로 전체의의 재발, 다시 시작, 그 문제는 당신이 사용 환경 설정에서 값을 저장 다음, 환경 설정을 커밋하지 않는 생각 :

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

'apply()'는 백그라운드에서 쓰기가 가능하기 때문에'commit()'보다 낫다. – levengli

2

이 시도하십시오 나를 위해 노력하고 있습니다 . 속성을 다음과 같이 설정하십시오.

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

바람이 불지 않아 커밋하지 않아도됩니다. 당신이 커밋 될 때까지

17

을 당신은 당신의 변경 가능성을 투입하지 않을 :

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

내가

preferences.getString(key, defaultValue); 

감사에 의해 그것을 얻을, 빅터

+23

바람을 향한 방귀에 +1. – StackOverflowed

+0

빨리 에스컬레이트 됨 : D –

0

기본 설정은 즉 :

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

편집, 저장되지 않습니다 : 위는 (의견의) 미묘한 버그가; 에디터 개체에 대한 참조를 유지해야합니다. 그렇지 않으면 값을 커밋하는 위의 예제는 새 인스턴스를 만듭니다. 해야 다음 Android docs에서 참고로

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

: 당신은 당신이 에서 수행하는 모든 변경 사항을 가지고 commit()를 호출해야합니다

참고 편집기 실제로 된 SharedPreferences에 표시됩니다.

+0

String을 넣은 것과 다른 Editor 인스턴스에서 커밋하고 있기 때문에이 코드는 잘못되었습니다. – ffleandro

+0

@ffleandro -이 코드가 잘못된 경우이 질문에 대한 대답도 하나씩입니다. –

+2

아무도, 나는 정답을 많이 보았다. 답은'preferences.edit()'를 호출 할 때'SharedPreferences.Editor' 객체를 생성하는 것입니다. 당신이'commit' 할 때 당신은'putString'을 호출 한 인스턴스가 아닌 다른 인스턴스에서 커밋하고 있기 때문에 지속되지 않습니다. 나는 당신이 게시 한'문서들'을 다시 읽는 것을 추천한다. – ffleandro

1

는 현

SharedPreferences pref1 = getSharedPreferences(PREFS_NAME, 0); 
boolean silent = pref1.getString("silentMode", "..."); 
가치를 얻을 수

는 vlue 사용 onstoe을 저장하거나 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의 유일한주의 사항은 다음과 같습니다. 반환 값에 대해 신경 쓰지 않고 응용 프로그램의 기본 스레드에서이 값을 사용하는 경우 대신 #apply}를 사용하는 것이 좋습니다. –

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

    }