Android:SharedPreferences 数据存取


目录
  • SharedPreferences
    • 获得 SharedPreferences 对象
    • 数据存入和读取
  • SharedPreferences 样例
    • 程序需求
    • 代码编写
      • activity_main
      • MainActivity
    • 运行效果
  • 参考资料

SharedPreferences

很多软件都有配置文件,存放程序运行的属性值,如默认欢迎语、登录用户名和密码等。配置用信息的量并不大,采用数据库来存放的话,数据库的连接和数据的操作较为耗时,会影响程序的效率。Android提供了SharedPreferences机制来实现轻量级的数据存储,以键值对(key,value)的方式存储信息。

获得 SharedPreferences 对象

获得 SharedPreferences 对象有两种方式,第一种是通过 getSharedPreferences() 方法得到 SharedPreferences 对象。

public abstract SharedPreferences getSharedPreferences (String name, int mode);
参数 说明
name 保存后 xml 文件的名称
mode xml 文档的操作权限模式

SharedPreferences 有 4 种操作模式:

操作模式 说明
Context.MODE_PRIVATE 默认操作模式,代表该文件是私有数据,只能被应用本身访问,写入的内容会覆盖原文件的内容
Context.MODE APPEND 检查文件是否存在,存在就向文件追加内容,否则就创建新文件
Context.MODE_WORLD_READABLE 当前文件可以被其他应用读取
Context.MODE_WORLD_WRITEABLE 当前文件可以被其他应用写入

第二种是通过 PreferenceManager.getSharedPreferences(Context) 方法获取 SharedPreferences 对象,不能指定 xml 文件名,文件名使用默认的 < package name >+"_preferences.xml" 形式。

数据存入和读取

读写 SharedPreferences 数据要用到 SharedPreferences 接口的 Editor 对象。

public abstract SharedPreferences.Editor edit();

数据存入时通过 SharedPreferences.Editor 接口的 putXxx 方法上传 key-value 对。其中 Xxx 表示不同的数据类型,例如字符串类型的 value 需要用 putString() 方法。

public abstract SharedPreferences.Editor putString(String key, String value);

通过 SharedPreferences.Editor 接口的 commit 方法保存 key-value 对,commit 方法在事件结束后进行提交,将数据保存在数据库中。

public abstract boolean commit();

数据读取时通过 SharedPreferences 对象的键 key 获取对应 key 的键值,不同类型的键值有不同的函数如 getBoolean、getInt、getFloat 和 getLong 等。

public abstract String getString (String key, String defValue);

SharedPreferences 样例

程序需求

使用 SharePreferences 编写信息簿记住用户名、城市及性别等信息,当 APP 退出再次启动能够显示用户输入的信息。

代码编写

activity_main

<?xml version="1.0" encoding="utf-8"?>


    
    
    
    
    

    
        

        
        

    

    

        
        
        
    
    



MainActivity

package com.example.share;

import android.content.Context;
import android.content.SharedPreferences;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private EditText ename;
    private EditText city;
    private RadioGroup rg;
    private RadioButton man;
    private RadioButton woman;
    private RadioButton radioButton;
    private Button button;
    private SharedPreferences preferences;
    private SharedPreferences.Editor editor;
    private String text;

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

        //绑定对应布局控件
        rg = (RadioGroup) findViewById(R.id.radioGroup1);
        ename = (EditText) findViewById(R.id.ename);
        city = (EditText) findViewById(R.id.ecity);
        man = (RadioButton) findViewById(R.id.man);
        woman=(RadioButton)findViewById(R.id.woman);
        button = (Button) findViewById(R.id.submit);
        SharedPreferences sharedPreferences = getSharedPreferences("test", MODE_PRIVATE);

        //如果不为空
        if (sharedPreferences != null) {

            String nname = sharedPreferences.getString("name", "");
            String ecity = sharedPreferences.getString("city", "");
            text = sharedPreferences.getString("sex", "");
            ename.setText(nname);
            city.setText(ecity);
            if (text.toString().equals("男")){
                man.setChecked(true);
            }
            if (text.toString().equals("女")) {
                woman.setChecked(true);
            }
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //1 创建 SharePreferences 对象
                radioButton = (RadioButton)findViewById(rg.getCheckedRadioButtonId());
                String name = ename.getText().toString();
                String ecity = city.getText().toString();
                String sex = radioButton.getText().toString();
                SharedPreferences sharedPreferences = getSharedPreferences("test", MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();

                //2  创建Editor对象,写入值
                editor.putString("name", name);
                editor.putString("city", ecity);
                editor.putString("sex", sex);

                //3  提交
                editor.commit();
                Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_LONG).show();
            }
        });
    }
}

运行效果

第一次打开 APP 的效果如下:

输入信息后,再次打开 APP 将显示之前输入的信息:

参考资料

《Android 移动应用开发》,杨谊 主编、喻德旷 副主编,人民邮电出版社