SharedPreferences数据存储的apply()和commit()区别

SharedPreferences用来进程间共享数据,它只能存储简单数据类型(int、boolean、String 等),
复杂数据类型建议使用文件、数据库等其他方式存储。

它的一般使用方法:

存数据:

        SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("name", "lala");
        editor.putInt("age", 18);
        editor.putBoolean("man", true);
        editor.apply();

取数据:

        SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
        String name = sp.getString("name", "aaa");
        int age = sp.getInt("age", 0);
        boolean man = sp.getBoolean("man", false);

清除数据;

        SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();

注意:
1. 上面用到的是Context类的getSharedPreferences()方法,需要传入文件名和操作模式,默认为0也就是MODE_PRIVATE。
获取SharedPreferences还有两种方法:Activity类的getPreferences()方法,和PreferenceManager类的静态方法getDefaultSharedPreferences()。前者会自动将当前类名作为文件名,只需要传入操作模式。后者需传入context,并自动使用包名作为前缀来命名SharedPreferences文件。

2.提交SharedPreferences数据时,可以用SharedPreferences.Editor的commit()方法,也 可以用它的apply()方法。两者有什么区别呢,下面的解释来自《阿里巴巴Android开发手册》:

SharedPreference 提 交 数 据 时 , 尽 量 使 用 Editor#apply()
,而非Editor#commit()。一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使用 Editor#commit()。

说明:

SharedPreference 相关修改使用 apply 方法进行提交会先写入内存,然后异步写入磁盘,commit
方法是直接写入磁盘。如果频繁操作的话 apply 的性能会优于 commit,apply会将最后修改内容写入磁盘。
但是如果希望立刻获取存储操作的结果,并据此做相应的其他操作,应当使用 commit。

正例:

public void updateSettingsAsync() {
    SharedPreferences mySharedPreferences = getSharedPreferences("settings", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = mySharedPreferences.edit();
    editor.putString("id", "foo");
    editor.apply();
}

public void updateSettings() {
    SharedPreferences mySharedPreferences = getSharedPreferences("settings", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = mySharedPreferences.edit();
    editor.putString("id", "foo");
    if (!editor.commit()) {
        Log.e(LOG_TAG, "Failed to commit setting changes");
    }
}

反例:

editor.putLong("key_name", "long value");
editor.commit();

猜你喜欢

转载自blog.csdn.net/fenggering/article/details/78197934