2012-02-09 43 views
8

Tôi đang sử dụng SharedPreferences trong Android.Everything hoạt động tuyệt vời trong cùng một phiên.SharedPreferences không liên tục

Tuy nhiên khi tôi khởi chạy lại ứng dụng, tất cả các tùy chọn đã được đặt từ phiên trước đó bị mất.

Có điều gì tôi cần chỉ định để cho biết SharedPreferences để treo xung quanh từ chạy đến chạy không?

tôi đang tạo ra các ưu đãi bằng cách gọi

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 

Sau đó, tôi thiết lập các thuộc bởi ví dụ

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

và tôi nhận được nó bằng cách

preferences.getString(key, defaultValue); 

Cảm ơn, Victor

+2

bạn đã viết editor.commit()? – Richa

+1

Nếu bạn 'Đặt Sakiboy

Trả lời

26

SharedPreferences là dai dẳng accross relaunch, khởi động lại, tôi nghĩ rằng vấn đề là bạn không commiting các ưu đãi, sử dụng sau đây để các giá trị lưu trữ trong tùy chọn:

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

'apply()' là tốt hơn so với 'commit()' vì nó cho phép các văn bản xảy ra trong nền – levengli

2

này đang làm việc cho tôi hãy thử:

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

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

Bạn đang có khả năng không cam kết thay đổi của bạn . Đặt thuộc tính giống như vậy

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

Nếu không có cam kết, bạn sẽ xì hơi trong gió.

+23

+1 để xì hơi trong gió. – StackOverflowed

+0

Điều đó đã được báo cáo nhanh chóng: D –

0

Chế độ ưu đãi sẽ không được lưu cho đến khi bạn cam kết họ, tức là .:

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

EDIT: Trên đây có một lỗi tinh tế (từ bình luận); bạn cần giữ tham chiếu đến đối tượng trình soạn thảo, nếu không ví dụ trên mà cam kết giá trị sẽ tạo một cá thể mới. Nên là:

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

Để tham khảo, từ Android docs:

Lưu ý rằng bạn phải gọi commit() có bất kỳ thay đổi bạn thực hiện trong Editor thực sự xuất hiện trong SharedPreferences.

+0

Mã này sai vì bạn đang cam kết trong một phiên bản Trình biên tập khác với trường hợp bạn đã đặt Chuỗi. – ffleandro

+0

@ffleandro - nếu mã này sai, thì đó là mọi câu trả lời khác cho câu hỏi này. –

+2

không có người đàn ông, tôi đã nhìn thấy rất nhiều câu trả lời đúng. Vấn đề với câu trả lời của bạn là khi bạn gọi 'preferences.edit()', bạn đang tạo một đối tượng 'SharedPreferences.Editor'. Khi bạn 'commit' bạn đang commit trong một instance khác với cái bạn đã gọi là' putString', do đó nó sẽ không tồn tại. Tôi khuyên bạn nên đọc lại 'tài liệu' bạn đã đăng. – ffleandro

1

để có được giá trị trong pref

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

để lưu sử dụng vlue onstoe hoặc onPause methds

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

Điều đó làm việc cho tôi tốt và khỏe mạnh

1

Nếu bạn đang phát triển cho cấp API?và trên đó bạn nên sử dụng editor.apply() thay vì editor.commit() khi sửa đổi tùy chọn tùy chọn của mình theo chương trình. editor.commit() không được dùng nữa và editor.apply() sẽ xử lý độ bền thực sự trong nền, mà editor.commit() không thực hiện.

Lưu ý rằng editor.apply(), nếu không thành công, sẽ âm thầm.

+0

Điều này chỉ là sai: commit() không được dùng nữa. Thông báo duy nhất trong API 22 là: Nếu bạn không quan tâm đến giá trị trả lại và bạn đang sử dụng điều này từ chuỗi chính của ứng dụng, hãy xem xét sử dụng {@link #apply} để thay thế. –

1

Đây là mã hoạt động cho tôi.

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

    }