数据存储与访问之——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:创建一个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();
}
新建一个安卓项目,在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
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的更多相关文章
- Android数据存储(一)----SharedPreferences详解
一.Android数据的存储方式: Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File:此外还有一种网络存储 ...
- 数据存储与访问之——初见SQLite数据库
本节引言: 本节学习Android数据库存储与访问的第三种方式:SQLite数据库,和其他的SQL数据库不同,我们并不需要在手机上另外安装一个数据库手机软件,Android系统已经集成了这 ...
- Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
1.Session的由来及其实现 HTTP协议是无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的.也就是说我们无法在服务器端确认两次请求是否是同一个用户所为,这为我们在一些应用场景中实现 ...
- Android数据存储与访问
1.文件 1)保存到手要内存,文件保存到/data/data对应的应用程序包下面 如 FILE_PATH = "/data/data/com.diysoul.filedem ...
- 从零開始学android<数据存储(1)SharedPreferences属性文件.三十五.>
在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...
- Android数据存储之共享参数SharedPreferences
SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的键值对方式,类似于Java的Properties类,二者都是把Key-Value的键值对保存 ...
- android(9)_数据存储和访问3_scard基本介绍
使用Activity的openFileOutput()保存文件的方法,文件存储在手机空间,通常情况下,手机的存储空间不是很大,存储小文件确定.假设你要存储大文件,如视频,是不可行. 对于这样大的文件, ...
- 【Android实验】 数据存储与访问sqlite
目录 实验目的 实验要求 实验过程 功能分析: 实验结果: 实验的代码 实验总结 实验目的 分别使用sqlite3工具和Android代码的方式建立SQLite数据库.在完成建立数据库的工作后 ...
- 【Android】数据存储和访问
一.SharedPreferences 2.SQLite
随机推荐
- java之扩展运算符
java中的扩展运算符为+=.-=./=.%=.*= 当使用扩展运算符时,变量在参与赋值运算时会把结果自动强制转换为当前变量的类型,比如: public class Test{ public stat ...
- SSM 轻量级框架构建:图书管理系统
一.接业务,作分析 1.大致业务要求 1.1 使用 SSM( Spring MVC + Spring + MyBatis )实现图书信息管理系统, MySQL5.5 作为后台数据库,该系统包括查询图书 ...
- 【Leetcode 做题学算法周刊】第六期
首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...
- Kerberos+SSH安装配置使用教程
一.背景说明 最早听说KDC和Kerberos应该是大三的<应用密码学>,当时感觉这套对称密钥分发机制比非对称密钥的PKI分发机制要好理解.但几年下来由于现实中使用SSL的场景比较比(主要 ...
- Oracle - 通过dg,完成单实例到rac的迁移
一.概述 本文将介绍如何给单实例搭建一个rac dg,以及如何对其进行角色转换,完成从单实例到rac的迁移.预先具备的知识(rac搭建,单实例-单实例dg搭建) 二.实验环境介绍 主库(已有数据库实例 ...
- python笔记03
day03 一.今日内容: 1.整型 2.字符串 3.布尔类型 二.内容回顾和补充 脑图--xmind软件,processon 1.运算符补充(in.not in) value = "我是中 ...
- SSM非springboot配置swagger2
前提:maven,ssm,不是springboot项目 1.在maven中添加依赖 <!-- Swagger2 Begin --> <!--springfox的核心jar包--> ...
- BFC 以及 外边距合并问题
BFC定义: BFC(Block formatting context)直译为"块级格式化上下文". 它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部 ...
- 计算机等级考试真题2(JAVA)
答案: 解析: (注:解析部分是博主用所学知识以及在百度上搜索总结出来的) 1. D (A)类属于JAVA语言的引用数据类型. (B)接口属于JAVA语言的引用数据类型. (C)数组属于JAVA语 ...
- 使用Future
/** * Runnable接口有个问题,它的方法没有返回值.如果任务需要一个返回结果,那么只能保存到变量,还要提供额外的方法读取,非常不便. * Java标准库还提供了一个Callable接口,和R ...