数据存储与访问之——SharedPreferences
使用sharedpreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在wifi下才能 联网等相关信息,如果使用数据库的话,显得有点大材小用了!我们把上面这些配置信息称为用户的偏好 设置,就是用户偏好的设置,而这些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而j2se中使用properties属性文件与xml文件来保存软件的配置信息;而在android中我们通常使用 一个轻量级的存储类——sharedpreferences来保存用户偏好的参数!sharedpreferences也是使用xml文件, 然后类似于map集合,使用键-值的形式来存储数据;我们只需要调用sharedpreferences的getxxx(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的使用
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 }
新建一个安卓项目,在res,layout,activity_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.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-----溺心与沉浮----博客园