如何在Android中使用SharedPreferences来存储、获取和编辑值

598

我想储存一个时间值并且需要检索和编辑它。我该如何使用SharedPreferences实现这个目的?


我已经实现了一个通用的SharedPreferences包装器,请看这里:http://android-know-how-to.blogspot.co.il/2014/03/androids-shared-preferences.html - TacB0sS
一个简化的方法是使用这个库:http://github.com/viralypatel/Android-SharedPreferences-Helper ... 更多技术细节请参见我的答案 - Viral Patel
https://dev59.com/LGAg5IYBdhLWcg3wZ6TY#25585711 - CrandellWS
30个回答

8

编辑

SharedPreferences pref = getSharedPreferences("YourPref", MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("yourValue", value);
editor.commit();

阅读

SharedPreferences pref = getSharedPreferences("YourPref", MODE_PRIVATE);
value= pref.getString("yourValue", "");

8

如何使用SharedPreferences存储登录值的简单解决方案。

您可以扩展MainActivity类或其他类,将“您想要保留的某些值”存储在其中。将其放入编写器和读取器类中:

public static final String GAME_PREFERENCES_LOGIN = "Login";

这里的InputClass是输入类,OutputClass是输出类。

// This is a storage, put this in a class which you can extend or in both classes:
//(input and output)
public static final String GAME_PREFERENCES_LOGIN = "Login";

// String from the text input (can be from anywhere)
String login = inputLogin.getText().toString();

// then to add a value in InputCalss "SAVE",
SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);
Editor editor = example.edit();
editor.putString("value", login);
editor.commit();

现在您可以在其他类中使用它,如下所示:OutputClass
SharedPreferences example = getSharedPreferences(GAME_PREFERENCES_LOGIN, 0);
String userString = example.getString("value", "defValue");

// the following will print it out in console
Logger.getLogger("Name of a OutputClass".class.getName()).log(Level.INFO, userString);

8

存储在SharedPreferences中

SharedPreferences preferences = getSharedPreferences("temp", getApplicationContext().MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putString("name", name);
editor.commit();

在SharedPreferences中获取数据

SharedPreferences preferences=getSharedPreferences("temp", getApplicationContext().MODE_PRIVATE);
String name=preferences.getString("name",null);

注意:"temp"是sharedpreferences的名称,"name"是输入值。如果值不存在,则返回null。

非常好用,而且易于使用。但是这里应该使用Context.MODE_PRIVATE而不是getApplicationContext().MODE_PRIVATE。 - Maria Gheorghe

7
editor.putString("text", mSaved.getText().toString());

这里,mSaved 可以是任何一个 TextViewEditText,我们可以从中提取一个字符串。你可以简单地指定一个字符串。这里的文本将是一个键,它保存了从 mSaved (TextViewEditText) 获取到的值。

SharedPreferences prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);

此外,没有必要使用包名“com.example.app”保存偏好文件。您可以提供自己喜欢的名称。希望这有所帮助!

6

SharedPreferences的基本思想是将数据存储在XML文件中。

  1. Declare your xml file path.(if you don't have this file, Android will create it. If you have this file, Android will access it.)

    SharedPreferences prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    
  2. Write value to Shared Preferences

    prefs.edit().putLong("preference_file_key", 1010101).apply();
    

    the preference_file_key is the name of shared preference files. And the 1010101 is the value you need to store.

    apply() at last is to save the changes. If you get error from apply(), change it to commit(). So this alternative sentence is

    prefs.edit().putLong("preference_file_key", 1010101).commit();
    
  3. Read from Shared Preferences

    SharedPreferences sp = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);
    long lsp = sp.getLong("preference_file_key", -1);
    

    lsp will be -1 if preference_file_key has no value. If 'preference_file_key' has a value, it will return the value of this.

整个编写的代码如下:
    SharedPreferences prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);    // Declare xml file
    prefs.edit().putLong("preference_file_key", 1010101).apply();    // Write the value to key.

读取的代码是:
    SharedPreferences sf = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);    // Declare xml file
    long lsp = sp.getLong("preference_file_key", -1);    // Read the key and store in lsp

Editor.apply() 需要 API 等级在 9 或以上。在此之下,请使用 Editor.commit()。 - Mr. Developerdude

6
您可以使用此方法保存值:
public void savePreferencesForReasonCode(Context context,
    String key, String value) {
    SharedPreferences sharedPreferences = PreferenceManager
    .getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
    }

使用这种方法,您可以从SharedPreferences获取值:
public String getPreferences(Context context, String prefKey) {
  SharedPreferences sharedPreferences = PreferenceManager
 .getDefaultSharedPreferences(context);
 return sharedPreferences.getString(prefKey, "");
}

这里的prefKey是您用来保存特定值的键。谢谢。


布尔值怎么样? - Yousha Aleayoub
保存使用以下代码行:editor.putString(key, value); 获取使用以下代码行:Boolean yourLocked = prefs.getBoolean("locked", false); - Md. Sajedul Karim

5

最佳实践

创建名为PreferenceManager接口(Interface)

// Interface to save values in shared preferences and also for retrieve values from shared preferences
public interface PreferenceManager {

    SharedPreferences getPreferences();
    Editor editPreferences();

    void setString(String key, String value);
    String getString(String key);

    void setBoolean(String key, boolean value);
    boolean getBoolean(String key);

    void setInteger(String key, int value);
    int getInteger(String key);

    void setFloat(String key, float value);
    float getFloat(String key);

}

如何在 Activity / Fragment 中使用:

public class HomeActivity extends AppCompatActivity implements PreferenceManager{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout_activity_home);
    }

    @Override
    public SharedPreferences getPreferences(){
        return getSharedPreferences("SP_TITLE", Context.MODE_PRIVATE);
    }

    @Override
    public SharedPreferences.Editor editPreferences(){
        return getPreferences().edit();
    }

    @Override
    public void setString(String key, String value) {
        editPreferences().putString(key, value).commit();
    }

    @Override
    public String getString(String key) {
        return getPreferences().getString(key, "");
    }

    @Override
    public void setBoolean(String key, boolean value) {
        editPreferences().putBoolean(key, value).commit();
    }

    @Override
    public boolean getBoolean(String key) {
        return  getPreferences().getBoolean(key, false);
    }

    @Override
    public void setInteger(String key, int value) {
        editPreferences().putInt(key, value).commit();
    }

    @Override
    public int getInteger(String key) {
        return getPreferences().getInt(key, 0);
    }

    @Override
    public void setFloat(String key, float value) {
        editPreferences().putFloat(key, value).commit();
    }

    @Override
    public float getFloat(String key) {
        return getPreferences().getFloat(key, 0);
    }
}

注意:请将SharedPreference的键替换为SP_TITLE

示例:

Shareperence存储字符串:

setString("my_key", "my_value");

从shareperence获取字符串:
String strValue = getString("my_key");

希望这能帮到你。

@Ruchir Baronia,不需要创建不同的对象,顺带一提,您不需要初始化共享参数的对象。您可以通过上述方法来保存。如果我这边还需要做些什么,请告诉我。 - Hiren Patel
好的,谢谢。你能帮我解决这个问题吗?http://stackoverflow.com/questions/35235759/after-changing-a-variable-do-i-have-to-restart/35236132?noredirect=1#comment58200727_35236132 - Ruchir Baronia
哦,非常抱歉,我提错问题了。我想问的是关于共享首选项的问题:)http://stackoverflow.com/questions/35244256/issue-with-if-statement/35244580#35244580 - Ruchir Baronia
嘿,我有一个关于Shared Preferences的问题。你介意回答一下吗?http://stackoverflow.com/questions/35713822/shared-preferences-extremely-simple-issue - Ruchir Baronia
commit()将会返回一个值,而apply由于是异步写入到首选项中,不会返回任何内容。如果您想要保存后的确认,请使用commit(); 我知道这已经过去几个月了。 - Ronnie
显示剩余11条评论

5

保存

PreferenceManager.getDefaultSharedPreferences(this).edit().putString("VarName","your value").apply();

获取:

String name = PreferenceManager.getDefaultSharedPreferences(this).getString("VarName","defaultValue");

默认值是:如果此偏好不存在,则返回的值。在某些情况下,您可以将“this”更改为“getActivity()”或“getApplicationContext()”。

嘿,我有一个关于Shared Preferences的问题。你介意回答一下吗?http://stackoverflow.com/questions/35713822/shared-preferences-extremely-simple-issue - Ruchir Baronia
是的,我做到了... :) - Ruchir Baronia

5
有许多人推荐如何使用SharedPreferences。我已经制作了一个演示项目demo project here。在示例中的关键点是使用ApplicationContext和单个sharedpreferences对象。这演示了如何使用SharedPreferences具有以下特点:
  • 使用singleton类来访问/更新SharedPreferences
  • 读写SharedPreferences时不需要始终传递上下文
  • 它使用apply()而不是commit()
  • apply()是异步保存,不返回任何内容,它首先在内存中更新值,然后异步写入磁盘。
  • commit()是同步保存,返回true/false基于结果。更改同步写入磁盘。
  • 适用于android 2.3+版本

以下为使用示例:

MyAppPreference.getInstance().setSampleStringKey("some_value");
String value= MyAppPreference.getInstance().getSampleStringKey();

获取源代码 & 在developer.android.com上可以找到详细API


嘿,我有一个关于Shared Preferences的问题。你介意回答一下吗?http://stackoverflow.com/questions/35713822/shared-preferences-extremely-simple-issue - Ruchir Baronia

3
SharedPreferences.Editor editor = getSharedPreferences("identifier", 
MODE_PRIVATE).edit();
//identifier is the unique to fetch data from your SharedPreference.


editor.putInt("keyword", 0); 
// saved value place with 0.
//use this "keyword" to fetch saved value again.
editor.commit();//important line without this line your value is not stored in preference   

// fetch the stored data using ....

SharedPreferences prefs = getSharedPreferences("identifier", MODE_PRIVATE); 
// here both identifier will same

int fetchvalue = prefs.getInt("keyword", 0);
// here keyword will same as used above.
// 0 is default value when you nothing save in preference that time fetch value is 0.

您需要在AdapterClass或其他类中使用SharedPreferences。此时只需使用以下声明并与上面的声明相同即可。
SharedPreferences.Editor editor = context.getSharedPreferences("idetifier", 
Context.MODE_PRIVATE).edit();
SharedPreferences prefs = context.getSharedPreferences("identifier", Context.MODE_PRIVATE);

//here context is your application context

对于字符串或布尔值

editor.putString("stringkeyword", "your string"); 
editor.putBoolean("booleankeyword","your boolean value");
editor.commit();

获取数据与上述相同。
String fetchvalue = prefs.getString("keyword", "");
Boolean fetchvalue = prefs.getBoolean("keyword", "");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接