Android之利用SharedPreferences进行简单数据存储
阅读原文时间:2021年04月20日阅读:1

1.SharedPreferences是Android系统提供的轻量级的数据保存方式,是将数据以最简单的方式进行永久性保存,在应用程序的使用中,用户经常会根据自己的习惯和偏好等更改应用程序的设置,或设定个性化内容,其中SharedPreferences类背后是用xml文件存放数据,SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享,其中用getSharedPreferences(name,mode)方法的第一个参数用于指定该xml文件的名称,名称不用带扩展名,Android系统会默认加上,方法中第二个参数指的是xml文件的操作模式,其中它有三种模式。一种为私有( Context.MODE_PRIVATE),一种为全局读(Context.MODE_WORLD_READABLE),一种为全局写(Context.MODE_WORLD_WRITEABLE),也可以读写操作模式(Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE),另外Activity还提供另一个getPreferences(mode)的方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为xml文件的名称。

2.接下来新建一个安卓项目,项目名为SharedPreferences,首先进行界面布局,打开res目录下的layout文件夹下的activity_main.xml文件,其中点击按钮将会调用MainActivity.java文件中的save()方法,代码附上:

activity_main.xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/name" />

    <EditText
        android:id="@+id/nameEt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/age" />

    <EditText
        android:id="@+id/ageEt"
        android:numeric="integer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/hobby" />

    <EditText
        android:id="@+id/hobbyEt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/save"
        android:onClick="save"/>

</LinearLayout>

3.接下来打开src目录下指定包名的MainActivity.java文件,里面有简单注释,其中按钮点击后调用save()方法,其中利用SharedPreferences类是在PreferencesService类下实现对数据的存放和保存并获取,详细看代码,其中MainActivity.java文件在com.example.sharedpreferencestest包下,PreferencesService.java在com.example.service包下,先附上MainActivity.java文件的代码,再附上PreferencesService.java的代码:

MainActivity.java文件:

package com.example.sharedpreferencestest;

import java.util.Map;

import com.example.service.PreferencesService;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText nameText;
    private EditText ageText;
    private EditText hobbyText;
    private PreferencesService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        nameText=(EditText)findViewById(R.id.nameEt);//获得输入姓名的编辑框控件
        ageText=(EditText)findViewById(R.id.ageEt);//获得输入年龄的编辑框控件
        hobbyText=(EditText)findViewById(R.id.hobbyEt);//获得输入爱好的编辑框控件
        service=new PreferencesService(MainActivity.this);//实例化一个PreferencesService对象
        Map<String,String> params=service.getPreferences();//调用PreferencesService类的getPreferences()方法,获取各项参数
        nameText.setText(params.get("name"));//设置姓名编辑框的内容
        ageText.setText(params.get("age"));//设置年龄编辑框的内容
        hobbyText.setText(params.get("hobby"));//设置爱好编辑框的内容
    }


    public void save(View v){
        String name=nameText.getText().toString();//获取姓名编辑框中的内容
        int age=Integer.parseInt(ageText.getText().toString());//获取年龄编辑框中的内容,并转换为整型
        String hobby=hobbyText.getText().toString();//获取姓名编辑框中的内容       
        service.save(name,age,hobby);//调用PreferencesService类的方法
        Toast.makeText(MainActivity.this, R.string.success, Toast.LENGTH_SHORT).show();//弹出"保存成功"的消息提示框
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

PreferencesService.java文件:

package com.example.service;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class PreferencesService {

    private Context context;

    //构造函数,获得上下文对象
    public PreferencesService(Context context) {
        this.context = context;
    }

    /**
     * 保存参数
     * @param name  姓名
     * @param age   年龄
     * @param hobby 爱好
     */
    public void save(String name, int age, String hobby) {
        // TODO Auto-generated method stub
        SharedPreferences preferences=context.getSharedPreferences("set", Context.MODE_PRIVATE);//获得Sharedpreferences对象,并把各项参数设置保存在set.xml文件下,并设置文件的操作模式为是私有的
        Editor editor=preferences.edit();//调用SharedPreferences类的编辑方法,获得编辑器对象,再往里面存放数据
        editor.putString("name", name);//存放姓名参数,只保存在preferences对象中,即内存中
        editor.putInt("age", age);//存放年龄参数,只保存在preferences对象中,即内存中
        editor.putString("hobby", hobby);//存放爱好参数,只保存在preferences对象中,即内存中
        editor.commit();//把内存中的内容提交到文件中     
    }

    /**
     * 获取各项参数
     * @return
     */
    public Map<String,String> getPreferences(){
        Map<String,String> params=new HashMap<String, String>();
        SharedPreferences preferences=context.getSharedPreferences("set", Context.MODE_PRIVATE);//获得Sharedpreferences对象,并把各项参数设置保存在set.xml文件下,并设置文件的操作模式为是私有的
        params.put("name", preferences.getString("name", ""));
        params.put("age", String.valueOf(preferences.getInt("age", 0)));
        params.put("hobby", preferences.getString("hobby", ""));
        return params;
    }

}

4.接下来附上此项目所用到的字符串string.xml文件的代码:

strings.xml文件:

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

    <string name="app_name">SharedPreferencesTest</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="name">姓名:</string>
    <string name="age">年龄:</string>
    <string name="hobby">爱好:</string>
    <string name="save">保存参数</string>
    <string name="success">保存成功</string>
</resources>

5.这就完成了利用SharedPreferences来进行简单数据存取,运行该项目,运行效果会出现年龄那个编辑框内容为0,是因为代码里面设置了的原因,我进行测试时是如下图这样的,已经点击了保存参数这个按钮,并已经保存成功:

6.如果在我们运行项目后,这里需要用到一个视图工具,查看下eclipse下的视图工具File Explorer,这个要打开很简单,在Eclipse工具栏上有个Window,点击下拉菜单有show view的Other子菜单,依照下图可以找到:

此时输入各项编辑框内容后,没点击保存参数按钮时,查看File Explorer视图,在data目录下的data目录下有相应的包名,找到这个项目的包名,如下图所示:

这时包下只有一个lib目录,点击保存参数按钮后,视图发生下图的改变,多了两个文件夹,其中cache是缓存文件,另一个是shared_prefs目录,下面有个set.xml文件,即是我所利用sharedPreferences来进行简单存储的set.xml文件:

7.接下来我们把那个set.xml文件导出到我的计算机看看,点击下图箭头指向的那个图标:

8.导出之后用记事本查看一下,看我们所配置的参数是否保存在此xml文件中,打开后如下图:

9.从上图发现输入到编辑框里的各项参数都保存到xml文件中了,其实上面的代码还有一样功能,就是你退出本安卓应用后,再次打开,里面的各项参数还照样显示,因为在PreferencesService类里面获取了第一次所输入的参数内容,然后在MainActivity.java文件下又设置了编辑框文本内容,所以第二次甚至第三次打开还会显示,除非里面的参数项被改变并点击了保存按钮,这个需要大家去实验一下,理解代码了,即如下图一样:

10.以上就是如何使用SharedPreferences来进行简单存储的内容,仅供大家学习参考,写得不好,请见谅,如有错误请指出,谢谢!