欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

数据存储与访问之——SharedPreferences

程序员文章站 2023-01-14 11:51:15
使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信 ......

  使用sharedpreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而j2se中使用properties属性文件与xml文件来保存软件的配置信息;而在android中我们通常使用 一个轻量级的存储类——sharedpreferences来保存用户偏好的参数!sharedpreferences也是使用xml文件, 然后类似于map集合,使用键-值的形式来存储数据;我们只需要调用sharedpreferencesgetxxx(name), 就可以根据键获得对应的值!使用起来很方便!

 

  sharedpreferences是一种轻型的android数据存储方式,它的本质是基于xml文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。sharedpreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过editor对象实现。比较经典的使用方式例如用户输入框对过往登录账户的存储。实现sharedpreferences存储的步骤如下:

 

1、根据context获取sharedpreferences对象
2、利用edit()方法获取editor对象。
3、通过editor对象存储key-value键值对数据。
4、通过apply()方法提交数据。

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者by-----溺心与沉浮----博客园

sharedpreferences的使用

  sharedpreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过sharedpreferences.edit()获取的内部接口editor对象实现。使用preference来存取数据,用到了sharedpreferences接口和sharedpreferences的一个内部接口sharedpreferences.editor,这两个接口在android.content包中;

 1 1)写入数据:
 2      //步骤1:创建一个sharedpreferences对象
 3      sharedpreferences sharedpreferences= getsharedpreferences("data",context.mode_private);
 4      //步骤2: 实例化sharedpreferences.editor对象
 5      sharedpreferences.editor editor = sharedpreferences.edit();
 6      //步骤3:将获取过来的值放入文件
 7      editor.putstring("name", “tom”);
 8      editor.putint("age", 28);
 9      editor.putboolean("marrid",false);
10      //步骤4:提交               
11      editor.commit();(apply())
12 
13  2)读取数据:
14      sharedpreferences sharedpreferences= getsharedpreferences("data", context .mode_private);
15      string userid=sharedpreferences.getstring("name","");
16   
17 3)删除指定数据
18      editor.remove("name");
19      editor.commit();
20 
21 4)清空数据
22      editor.clear();
23      editor.commit();(apply())

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者by-----溺心与沉浮----博客园 

 

注意:如果在 fragment 中使用sharedpreferences 时,需要放在onattach(activity activity)里面进行sharedpreferences的初始化,否则会报空指针 即 getactivity()会可能返回null

读写其他应用的sharedpreferences 步骤如下(未实践):
 1. 在创建sharedpreferences时,指定mode_world_readable模式,表明该sharedpreferences数据可以被其他程序读取;
 2. 创建其他应用程序对应的context
 3. 使用其他程序的context获取对应的sharedpreferences
 4. 如果是写入数据,使用editor接口即可,所有其他操作均和前面一致;

 1 * sharedpreferences数据的四种操作模式:
 2      * 一、context.mode_private
 3      * 二、context.mode_append
 4      * 三、context.mode_world_readable
 5      * 四、context.mode_world_writeable
 6      *
 7      * context.mode_private:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
 8      * context.mode_append:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
 9      * context.mode_world_readable和context.mode_world_writeable用来控制其他应用是否有权限读写该文件.
10      *
11      * mode_world_readable:表示当前文件可以被其他应用读取.
12      * mode_world_writeable:表示当前文件可以被其他应用写入
13      *
14      * 特别注意:出于安全性的考虑,mode_world_readable 和 mode_world_writeable 在android 4.2版本中已经被弃用

 

 1 try {
 2 //这里的com.example.mpreferences 就是应用的包名
 3  context mcontext = createpackagecontext("com.example.mpreferences", context_ignore_security);
 4 
 5  sharedpreferences msharedpreferences = mcontext.getsharedpreferences("name_preference", mode_private);
 6  int count = msharedpreferences.getint("count", 0);
 7 
 8  } catch (packagemanager.namenotfoundexception e) {
 9        e.printstacktrace();
10  }

 

 

  新建一个安卓项目,在reslayoutactivity_main.xml添加代码

<?xml version="1.0" encoding="utf-8"?>
<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"
        tools:context=".mainactivity">

    <textview
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用户登录"/>
    <textview
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margintop="10dp"
            android:text="请输入用户名"/>
    <edittext
            android:id="@+id/editusername"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户名"/>
    <textview
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margintop="10dp"
            android:text="请输入密码"/>
    <edittext
            android:id="@+id/edituserpassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="密码"/>
    <button
            android:id="@+id/button_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登陆"/>
</linearlayout>

效果如下:

数据存储与访问之——SharedPreferences

 

 简单的sharedpreferences工具类编写sharedpreferences.java

 1 package com.reverse-xiaoyu.sharedpreferencesutillty;
 2 
 3 import android.content.context;
 4 import android.content.sharedpreferences;
 5 import android.widget.toast;
 6 
 7 import java.util.hashmap;
 8 import java.util.map;
 9 
10 public class sharedhelp {
11     private context context;
12 
13     public sharedhelp(){
14 
15     }
16 
17     public sharedhelp(context context){
18         this.context = context;
19     }
20 
21     public void save(string username, string password){
22         sharedpreferences sp = context.getsharedpreferences("mymap", context.mode_private);
23         sharedpreferences.editor editor = sp.edit();
24         editor.putstring("username", username);
25         editor.putstring("password", password);
26         editor.apply();
27         toast.maketext(context, "信息已写入sharedpreferences中", toast.length_short).show();
28     }
29 
30     public map<string, string> read(){
31         map<string, string> data = new hashmap<string, string>();
32         sharedpreferences sp = context.getsharedpreferences("mymap", context.mode_private);
33         data.put("username", sp.getstring("username", ""));
34         data.put("password", sp.getstring("password", ""));
35         return data;
36     }
37 }

 

 在mainactivity中实现逻辑

 1 package com.reverse-xiaoyu.sharedpreferencesutillty;
 2 
 3 import androidx.appcompat.app.appcompatactivity;
 4 
 5 import android.content.context;
 6 import android.os.bundle;
 7 import android.view.view;
 8 import android.widget.button;
 9 import android.widget.edittext;
10 
11 import java.util.map;
12 
13 public class mainactivity extends appcompatactivity {
14     //实例化layout中edittext的editusernmae
15     private edittext editusername;
16     //实例化layout中edittext的edituserpassword
17     private edittext edituserpassword;
18     //实例化layout中button的button_login
19     private button button_login;
20     //定义上下文
21     private context context;
22     //定义sharehelp类的对象
23     private sharedhelp sharedhelp;
24     //定义两个字符串名
25     private string strname;
26     private string strpassword;
27 
28     @override
29     protected void oncreate(bundle savedinstancestate) {
30         super.oncreate(savedinstancestate);
31         setcontentview(r.layout.activity_main);
32         //获取上下文
33         context = getapplicationcontext();
34         sharedhelp = new sharedhelp();
35         bindviews();
36     }
37 
38     private void bindviews(){
39         //实例化的变量绑定相应的id
40         editusername = findviewbyid(r.id.editusername);
41         edituserpassword = findviewbyid(r.id.edituserpassword);
42         button_login = findviewbyid(r.id.button_login);
43         //为按钮设置监听事件
44         button_login.setonclicklistener(new view.onclicklistener() {
45             @override
46             public void onclick(view view) {
47                 //当按钮被按下触发时,从控件中gettext()并将其转换成字符串
48                 strname = editusername.gettext().tostring();
49                 strpassword = edituserpassword.gettext().tostring();
50                 //通过sharedhelp类中save方法,将其保存
51                 sharedhelp.save(strname, strpassword);
52             }
53         });
54     }
55 
56     @override
57     protected void onstart() {
58         super.onstart();
59         //定义一个map<string, string>类型的变量data用来接收sharehelp.read()方法的返回值
60         map<string, string> data = sharedhelp.read();
61         //将获取到的数据放置到两个edittext中
62         editusername.settext(data.get("username"));
63         edituserpassword.settext(data.get("password"));
64     }
65 }

 

 本人十分不建议代码在主程序入口处写,建议另起文件写,方便交流,就在mainactivity中写了

 版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者by-----溺心与沉浮----博客园

 

 最后再写一个sharedpreferences的工具集类

 sharedpreferencesutillty.java

  1 package com.reverse-xiaoyu.sharedpreferencesutillty;
  2 
  3 import android.content.context;
  4 import android.content.sharedpreferences;
  5 
  6 import java.util.map;
  7 
  8 public class sharedpreferenceutillty {
  9     //保存的sp文件名
 10     public static final string file_name = "mymap";
 11 
 12     /**
 13      * sharedpreferences数据的四种操作模式:
 14      * 一、context.mode_private
 15      * 二、context.mode_append
 16      * 三、context.mode_world_readable
 17      * 四、context.mode_world_writeable
 18      *
 19      * context.mode_private:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
 20      * context.mode_append:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
 21      * context.mode_world_readable和context.mode_world_writeable用来控制其他应用是否有权限读写该文件.
 22      *
 23      * mode_world_readable:表示当前文件可以被其他应用读取.
 24      * mode_world_writeable:表示当前文件可以被其他应用写入
 25      *
 26      * 特别注意:出于安全性的考虑,mode_world_readable 和 mode_world_writeable 在android 4.2版本中已经被弃用
 27      */
 28 
 29     /**
 30      * 保存数据
 31      */
 32     public static void putdata(context context, string key, object object){
 33         //实例化sharedpreferences对象(第一步)
 34         sharedpreferences sp = context.getsharedpreferences(file_name, context.mode_private);
 35         //实例化sharedpreferences.editor对象(第二步)
 36         sharedpreferences.editor editor = sp.edit();
 37         //用putobject的方法保存数据,取决于第三个参数你使用的什么类型的变量
 38         if (object instanceof boolean){
 39             editor.putboolean(key, (boolean) object);
 40         }else if (object instanceof float){
 41             editor.putfloat(key, (float) object);
 42         }else if (object instanceof integer){
 43             editor.putint(key, (integer) object);
 44         }else if (object instanceof long){
 45             editor.putlong(key, (long) object);
 46         }else if (object instanceof string){
 47             editor.putstring(key, (string) object);
 48         }
 49         editor.apply();
 50     }
 51 
 52     /**
 53      * 获取指定数据
 54      */
 55     public static object getdata(context context, string key, object object){
 56         //实例化sharedpreferences对象(第一步)
 57         sharedpreferences sp = context.getsharedpreferences(file_name, context.mode_private);
 58         //用getobject的方法保存数据,取决于第三个参数你使用的什么类型的变量(第二步)
 59         if (object instanceof boolean){
 60             return sp.getboolean(key, (boolean) object);
 61         }else if (object instanceof float){
 62             return sp.getfloat(key, (float) object);
 63         }else if (object instanceof integer){
 64             return sp.getint(key, (integer) object);
 65         }else if (object instanceof long){
 66             return sp.getlong(key, (long) object);
 67         }else if (object instanceof string){
 68             return sp.getstring(key, (string) object);
 69         }
 70         return null;
 71     }
 72 
 73     /**
 74      * 返回所有的键值对
 75      */
 76     public static map<string, ?> getall(context context){
 77         sharedpreferences sp = context.getsharedpreferences(file_name, context.mode_private);
 78         map<string, ?> map = sp.getall();
 79         return map;
 80     }
 81 
 82     /**
 83      * 检查对应的数据是否存在
 84      */
 85     public static boolean contains(context context, string key){
 86         sharedpreferences sp = context.getsharedpreferences(file_name, context.mode_private);
 87         return sp.contains(key);
 88     }
 89 
 90     /**
 91      * 删除指定key值的数据
 92      */
 93     public static void remove(context context, string key){
 94         sharedpreferences sp = context.getsharedpreferences(file_name, context.mode_private);
 95         sharedpreferences.editor editor = sp.edit();
 96         editor.remove(key);
 97         editor.apply();
 98     }
 99 
100     /**
101      * 删除所有的数据
102      */
103     public static void clear(context context, string key){
104         sharedpreferences sp = context.getsharedpreferences(file_name, context.mode_private);
105         sharedpreferences.editor editor = sp.edit();
106         editor.clear();
107         editor.apply();
108     }
109 
110 }

 

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-28,17:41:40。
作者by-----溺心与沉浮----博客园