使用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:创建一个SharedPreferences对象
SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
//步骤2: 实例化SharedPreferences.Editor对象
SharedPreferences.Editor editor = sharedPreferences.edit();
//步骤3:将获取过来的值放入文件
editor.putString("name", “Tom”);
editor.putInt("age", );
editor.putBoolean("marrid",false);
//步骤4:提交
editor.commit();(apply()) )读取数据:
SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
String userId=sharedPreferences.getString("name",""); )删除指定数据
editor.remove("name");
editor.commit(); )清空数据
editor.clear();
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接口即可,所有其他操作均和前面一致;

 * SharedPreferences数据的四种操作模式:
* 一、Context.MODE_PRIVATE
* 二、Context.MODE_APPEND
* 三、Context.MODE_WORLD_READABLE
* 四、Context.MODE_WORLD_WRITEABLE
*
* Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
* Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
* Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
*
* MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
* MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
*
* 特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android .2版本中已经被弃用
 try {
//这里的com.example.mpreferences 就是应用的包名
Context mcontext = createPackageContext("com.example.mpreferences", CONTEXT_IGNORE_SECURITY); SharedPreferences msharedpreferences = mcontext.getSharedPreferences("name_preference", MODE_PRIVATE);
int count = msharedpreferences.getInt("count", 0); } catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

  新建一个安卓项目,在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.java

 package com.Reverse-xiaoyu.sharedpreferencesutillty;

 import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast; import java.util.HashMap;
import java.util.Map; public class SharedHelp {
private Context context; public SharedHelp(){ } public SharedHelp(Context context){
this.context = context;
} public void save(String userName, String passWord){
SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("userName", userName);
editor.putString("passWord", passWord);
editor.apply();
Toast.makeText(context, "信息已写入SharedPreferences中", Toast.LENGTH_SHORT).show();
} public Map<String, String> read(){
Map<String, String> data = new HashMap<String, String>();
SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
data.put("userName", sp.getString("userName", ""));
data.put("passWord", sp.getString("passWord", ""));
return data;
}
}

在MainActivity中实现逻辑

 package com.Reverse-xiaoyu.sharedpreferencesutillty;

 import androidx.appcompat.app.AppCompatActivity;

 import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText; import java.util.Map; public class MainActivity extends AppCompatActivity {
//实例化layout中EditText的editUserNmae
private EditText editUserName;
//实例化layout中EditText的editUserPassword
private EditText editUserPassword;
//实例化layout中Button的button_login
private Button button_login;
//定义上下文
private Context context;
//定义ShareHelp类的对象
private SharedHelp sharedHelp;
//定义两个字符串名
private String strName;
private String strPassword; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取上下文
context = getApplicationContext();
sharedHelp = new SharedHelp();
bindViews();
} private void bindViews(){
//实例化的变量绑定相应的ID
editUserName = findViewById(R.id.editUserName);
editUserPassword = findViewById(R.id.editUserPassword);
button_login = findViewById(R.id.button_login);
//为按钮设置监听事件
button_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//当按钮被按下触发时,从控件中getText()并将其转换成字符串
strName = editUserName.getText().toString();
strPassword = editUserPassword.getText().toString();
//通过SharedHelp类中save方法,将其保存
sharedHelp.save(strName, strPassword);
}
});
} @Override
protected void onStart() {
super.onStart();
//定义一个Map<String, String>类型的变量data用来接收shareHelp.read()方法的返回值
Map<String, String> data = sharedHelp.read();
//将获取到的数据放置到两个EditText中
editUserName.setText(data.get("userName"));
editUserPassword.setText(data.get("passWord"));
}
}

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

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

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

SharedPreferencesUtillty.java

 package com.Reverse-xiaoyu.sharedpreferencesutillty;

 import android.content.Context;
import android.content.SharedPreferences; import java.util.Map; public class SharedPreferenceUtillty {
//保存的SP文件名
public static final String FILE_NAME = "MyMap"; /**
* SharedPreferences数据的四种操作模式:
* 一、Context.MODE_PRIVATE
* 二、Context.MODE_APPEND
* 三、Context.MODE_WORLD_READABLE
* 四、Context.MODE_WORLD_WRITEABLE
*
* Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
* Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
* Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
*
* MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
* MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
*
* 特别注意:出于安全性的考虑,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已经被弃用
*/ /**
* 保存数据
*/
public static void putData(Context context, String key, Object object){
//实例化SharedPreferences对象(第一步)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
//实例化SharedPreferences.Editor对象(第二步)
SharedPreferences.Editor editor = sp.edit();
//用putObject的方法保存数据,取决于第三个参数你使用的什么类型的变量
if (object instanceof Boolean){
editor.putBoolean(key, (Boolean) object);
}else if (object instanceof Float){
editor.putFloat(key, (Float) object);
}else if (object instanceof Integer){
editor.putInt(key, (Integer) object);
}else if (object instanceof Long){
editor.putLong(key, (Long) object);
}else if (object instanceof String){
editor.putString(key, (String) object);
}
editor.apply();
} /**
* 获取指定数据
*/
public static Object getData(Context context, String key, Object object){
//实例化SharedPreferences对象(第一步)
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
//用getObject的方法保存数据,取决于第三个参数你使用的什么类型的变量(第二步)
if (object instanceof Boolean){
return sp.getBoolean(key, (Boolean) object);
}else if (object instanceof Float){
return sp.getFloat(key, (Float) object);
}else if (object instanceof Integer){
return sp.getInt(key, (Integer) object);
}else if (object instanceof Long){
return sp.getLong(key, (Long) object);
}else if (object instanceof String){
return sp.getString(key, (String) object);
}
return null;
} /**
* 返回所有的键值对
*/
public static Map<String, ?> getAll(Context context){
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
Map<String, ?> map = sp.getAll();
return map;
} /**
* 检查对应的数据是否存在
*/
public static boolean contains(Context context, String key){
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
return sp.contains(key);
} /**
* 删除指定key值的数据
*/
public static void remove(Context context, String key){
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
editor.apply();
} /**
* 删除所有的数据
*/
public static void clear(Context context, String key){
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
editor.apply();
} }

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

数据存储与访问之——SharedPreferences的更多相关文章

  1. Android数据存储(一)----SharedPreferences详解

    一.Android数据的存储方式: Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File:此外还有一种网络存储 ...

  2. 数据存储与访问之——初见SQLite数据库

          本节引言: 本节学习Android数据库存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同,我们并不需要在手机上另外安装一个数据库手机软件,Android系统已经集成了这 ...

  3. Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程

    1.Session的由来及其实现 HTTP协议是无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的.也就是说我们无法在服务器端确认两次请求是否是同一个用户所为,这为我们在一些应用场景中实现 ...

  4. Android数据存储与访问

    1.文件    1)保存到手要内存,文件保存到/data/data对应的应用程序包下面    如    FILE_PATH = "/data/data/com.diysoul.filedem ...

  5. 从零開始学android&lt;数据存储(1)SharedPreferences属性文件.三十五.&gt;

    在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...

  6. Android数据存储之共享参数SharedPreferences

    SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式,类似于Java的Properties类,二者都是把Key-Value的键值对保存 ...

  7. android(9)_数据存储和访问3_scard基本介绍

    使用Activity的openFileOutput()保存文件的方法,文件存储在手机空间,通常情况下,手机的存储空间不是很大,存储小文件确定.假设你要存储大文件,如视频,是不可行. 对于这样大的文件, ...

  8. 【Android实验】 数据存储与访问sqlite

    目录 实验目的 实验要求 实验过程 功能分析: 实验结果: 实验的代码 实验总结 实验目的     分别使用sqlite3工具和Android代码的方式建立SQLite数据库.在完成建立数据库的工作后 ...

  9. 【Android】数据存储和访问

    一.SharedPreferences 2.SQLite

随机推荐

  1. JSP + Session Cookie详解

    篇幅较大,对JSP进行了非常详细的讲解,并解释了Session和Cookie的实现原理 ,预计看完需要20分钟左右,慢慢享受吧 JSP概述 掌握了servlet后,就可以利用servlet来开发动态页 ...

  2. iOS UILable和属性字符串的使用

    UILable的常用方法和属性 设置文字颜色(默认为黑色) @property(nonatomic,strong) UIColor     *textColor 设置显示文字 @property(no ...

  3. 数据库Oracle通用函数

    通用函数:可用于任意数据类型,并且适用于空值.• NVL (expr1, expr2) • NVL2 (expr1, expr2, expr3) • NULLIF (expr1, expr2) • C ...

  4. HTML5基础 实例

    <!DOCTYPE html><html> <head> <title>李清照简介</title> </head> <bo ...

  5. [TimLinux] JavaScript 阻止父节点接收子节点事件的方法

    1. 事件 两种类型的事件:触发式.冒泡式 2. 冒泡式 触发式:事件从DOM结构的顶层往下走的事件触发过程: 冒泡式:事件从DOM结构的底层往上走的事件触发过程. 3. 父子节点 当父.子节点同时对 ...

  6. UVA-11987

    I hope you know the beautiful Union-Find structure. In this problem, you're to implement somethingsi ...

  7. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  8. 基于STM32F1 的BASIC解码实验 vb basic 液晶显示执行过程及结果

    基于STM32F1 的BASIC解码实验 1.basic程序以文件形式存储 2.程序文件存储在sd卡 3.解释结果显示在液晶屏上 主函数部分 int main(void){ u16 i,j; dela ...

  9. Python 3 对象关系映射(ORM)

    ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...

  10. Nginx(二)--nginx的核心功能

    反向代理 nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理. proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端 ...