【Android】数据存储全方案之SharedPreferenc

作者: 吾非言 | 来源:发表于2017-10-09 17:05 被阅读333次

作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc

本文选自书客创作平台第5篇文章。阅读原文

书客创作

SharedPreferences是通过键值对的形式保存数据,存储数据是以xml文件形式存储,文件存放在/data/data/<package name>/shared_prefs目录下。常常用来保存应用程序的一些简单的属性设置。例如,可以通过它保存用户上一次所做的增加或者修改的参数,当再次启动该界面或应用时,依然保持原有的设置。

得到SharedPreferences对象可以通过三种方式:

Activity类中的getPreferences(mode)方法。

  1. mode:指定操作模式。
  2. 使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。
  3. 一般不与其他模块进行共享数据的时才会使用。

Context类中的getSharedPreferences(name, mode)方法。

  1. name:用于指定SharedPreferences文件的名称。
  2. mode:指定操作模式。

PreferenceManager类中的getDefaultSharedPreferences(context)方法。

  1. 这是一个静态方法,使用当前应用程序的包名作为前缀名来命名文件。

注:SharedPreferences可实现数据共享,但是无法直接在多个程序间共享,需要借助于Conttent Providers。

SharedPreferences操作模式:

  1. MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。
  2. MODE_APPEND:则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。
  3. 还有另外两种(android4.2被废弃),MODE_ WORLD_ READABLE和MODE_WORLD _WRITEABLE,这两种模式表示允许其他的应用程序对我们程序中的文件进行读写操作。

SharedPreferences通过Editor进行数据的编辑处理。

SharedPreferences.edit();

Editor常用方法:

1、存放数据到SharedPreferences,例如保存String类型putString。

/**
 * @param var1 键
 * @param var2 值
 */
Editor.putString(String var1, String var2);
Editor.putStringSet(String var1, Set<String> var2);
Editor.putInt(String var1, int var2);
Editor.putLong(String var1, long var2);
Editor.putFloat(String var1, float var2);
Editor.putBoolean(String var1, boolean var2);

2、移除数据。

/**
 * @param var1 键
 */
Editor.remove(String var1);

3、清空数据。

Editor.clear();

4、后台提交,没有任何返回值。

Editor.apply();

5、编译处理,返回boolean。

Editor.commit();

注:apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘,而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。

SharedPreferences取出数据:

/**
 * @param var1 键
 * @param var2 默认值
 */
String getString(String var1, String var2);
Set<String> getStringSet(String var1, Set<String> var2);
int getInt(String var1, int var2);
long getLong(String var1, long var2);
float getFloat(String var1, float var2);
boolean getBoolean(String var1, boolean var2);
boolean contains(String var1);

实例:通过sharePreferences来实现记住密码的功能,当点击提交时,如果勾选checkbox记住密码,则会保存密码,下次启动应用会显示账号密码。当不勾选checkbox时,不会保存账号密码,同时如果已保存的有账号密码的话,会删除保存的账号密码(这里不做验证密码的操作)。

1、布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/ed_name"
        android:inputType="text"
        android:padding="10dp"
        android:hint="@string/name_tip"
        android:layout_width="match_parent"
        android:textSize="16sp"
        android:layout_marginTop="10dp"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/ed_passwd"
        android:inputType="textPassword"
        android:padding="10dp"
        android:textSize="16sp"
        android:layout_marginTop="10dp"
        android:hint="@string/passwd_tip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:text="@string/remember_passwd"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="wrap_content"
        android:id="@+id/btn_submit"
        android:text="@string/submit"
        android:layout_gravity="center"
        android:layout_height="wrap_content" />
</LinearLayout>

效果图:


效果图1

2、业务逻辑处理:

/**
 * SharedPreferences存储
 * Created by 邹峰立 on 2017/9/19 0019.
 */
public class SharedPreferencesActivity extends AppCompatActivity {
    private EditText nameEd, passwdEd;
    private CheckBox checkBox;
    private String mKeyPasswd = "passwd";
    private String mKeyName = "name";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sharedpreferences);

        initView();
    }

    // 初始化控件
    private void initView() {
        nameEd = findViewById(R.id.ed_name);
        passwdEd = findViewById(R.id.ed_passwd);
        checkBox = findViewById(R.id.checkbox);
        // 赋值
        nameEd.setText(readData(mKeyName).toString());
        passwdEd.setText(readData(mKeyPasswd).toString());
        Button button = findViewById(R.id.btn_submit);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (checkBox.isChecked()) {
                    String name = nameEd.getText().toString().trim();
                    String passwd = passwdEd.getText().toString().trim();
                    boolean nameBool = saveData(name, mKeyName);
                    boolean passwdPool = saveData(passwd, mKeyPasswd);
                    Log.d("bool", nameBool + "--" + passwdPool);
                } else {
                    remove();
                }
                finish();
            }
        });
    }

    // 移除数据
    private void remove() {
        SharedPreferences sharedPreferences = getSharedPreferences();
        // 获取编辑对象
        SharedPreferences.Editor editor = sharedPreferences.edit();
        // 移除
        editor.remove(mKeyPasswd);
        // 提交
        editor.apply();// 后台提交
    }

    // 清空数据
    private void clearAll() {
        SharedPreferences sharedPreferences = getSharedPreferences();
        // 获取编辑对象
        SharedPreferences.Editor editor = sharedPreferences.edit();
        // 清空
        editor.clear();
        // 提交
        editor.apply();// 后台提交
    }

    /**
     * 保存数据
     *
     * @param obj 待保存数据
     * @return true/false
     */
    private boolean saveData(Object obj, String key) {
        SharedPreferences sharedPreferences = getSharedPreferences();
        // 获取编辑对象
        SharedPreferences.Editor editor = sharedPreferences.edit();
        // 添加数据
        editor.putString(key, obj.toString());
        // 提交保存
        // editor.apply();// 后台提交
        return editor.commit();// 马上提交
    }

    /**
     * 读取值
     *
     * @param key 键值
     * @return 待读取内容
     */
    private Object readData(String key) {
        SharedPreferences sharedPreferences = getSharedPreferences();
        // 获取值
        return sharedPreferences.getString(key, "");
    }

    // 获取sharedPreferences对象
    private SharedPreferences getSharedPreferences() {
//        SharedPreferences sharedPreferences = getSharedPreferences("mName", Context.MODE_PRIVATE);
//        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        // 如果不需要如其他模块数据共享使用
        return getPreferences(Activity.MODE_PRIVATE);
    }
}

效果图:


图片描述

这样就实现一个简单的SharedPreferences实例,最后通过查找/data/data//shared_prefs目录就可以找到SharedPreferences保存的相关xml文件。

GitHub地址
阅读原文


微信公众号:书客创作

相关文章

网友评论

    本文标题:【Android】数据存储全方案之SharedPreferenc

    本文链接:https://www.haomeiwen.com/subject/hhlwjxtx.html