使用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. git 使用详解(6)—— 3种撤消操作

    接下来,我们会介绍一些基本的撤消操作相关的命令.请注意,有些操作并不总是可以撤消的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果. 修改最后一次提交 git commit --amend 有 ...

  2. openstack网络(一)

    什么是OpenStack Networking OpenStack网络的特性 交换机 路由器 负载均衡 防火墙 虚拟专用网络 网络功能虚拟化 网络类型 管理网络 API 网络 外部网络 访客网络 在一 ...

  3. 声明式服务调用Feign

    什么是 Feign Feign 是种声明式.模板化的 HTTP 客户端(仅在 consumer 中使用).   什么是声明式,有什么作用,解决什么问题? 声明式调用就像调用本地方法一样调用远程方法;无 ...

  4. [TimLinux] TCP全连接队列满

    0. TCP三次握手 该图来自:TCP SOCKET中backlog参数的用途是什么? syns queue: 半连接队列 accept queue: 全连接队列 控制参数存放在文件:/proc/sy ...

  5. 第二节.NET两种交互模式:c/s和b/s

    1.什么是c/s           c指的是client(客户端),s指的是服务器模式,c/s是client/Server的缩写,客户端需要安装专业的客户端软件,如我们用的qq.酷狗音乐等客户端软件 ...

  6. 深入理解 Java 泛型

  7. 海思HI3518EV200+AR0130开发板DIY——前篇

    海思HI3518EV200+AR0130开发板DIY 今天开始要围绕这个项目学习了(还是得从C开始学 ) 缘起(这段主要水废话)相关开发资料 →_→ 原理图设计 原理图整体框架 一.电源部分 HI35 ...

  8. JS基础-正则

    正则表达式 创建正则表达式 使用一个正则表达式字面量 const regex = /^[a-zA-Z]+[0-9]*\W?_$/gi; 调用RegExp对象的构造函数 const regex = ne ...

  9. 【Spring Boot】定时任务

    [Spring Boot]定时任务 测试用业务Service package com.example.schedule.service; import org.springframework.ster ...

  10. 5种JVM垃圾收集器特点和8种JVM内存溢出原因

    先来看看5种JVM垃圾收集器特点 一.常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial O ...