当前位置: 首页 > news >正文

Android 存储之 SharedPreferences 框架体系编码模板

一、SharedPreferences 框架体系

1、SharedPreferences 基本介绍
  1. SharedPreferences 是 Android 的一个轻量级存储工具,它采用 key - value 的键值对方式进行存储

  2. 它允许保存和读取应用中的基本数据类型,例如,String、int、float、boolean 等

  3. 保存共享参数键值对信息的文件路径为:/data/data/【应用包名】/shared_prefs/【SharedPreferences 文件名】.xml

2、SharedPreferences 使用步骤
(1)获取 SharedPreferences 实例
  1. 其中,fileName 是为 SharedPreferences 文件指定的名称

  2. mode 是文件的操作模式,通常是 MODE_PRIVATE(私有模式)

SharedPreferences sharedPreferences = context.getSharedPreferences(【fileName】, 【mode】);
(2)写入数据
  1. 使用 SharedPreferences.Editor 来编辑数据,通过 SharedPreferences 实例的 edit 方法获取 Editor 对象

  2. 然后使用 put 相关方法来添加或修改数据,当 key - value 不存在时为添加,当 key - value 存在时为修改

  3. 最后调用 commit 方法来提交更改

SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putString(【key】, 【value】);
edit.commit();
(3)读取数据
  1. 通过 SharedPreferences 实例的 get 相关方法来读取数据

  2. 如果 key 不存在,则返回 defValue 默认值

sharedPreferences.getString(【key】, 【defValue】);
3、SharedPreferences 使用优化思路
  1. 在使用 SharedPreferences 时,我们往往只关注一存一取,即我们往往只关注【key】和【value】

  2. 我们往往不关注【context】、【fileName】、【mode】、【defValue】,在使用一一指定这些感觉过于繁琐

4、SharedPreferences 框架体系
  • 使用 SharedPreferences 框架体系,可以优化 SharedPreferences 的使用,增强 SharedPreferences 相关业务代码的可维护性,SharedPreferences 框架体系分为以下三部分
(1)SharedPreferences 工具类
  1. 封装原始的 SharedPreferences 操作(存、取)

  2. 简化掉【mode】和【defValue】

(2)SPStore
  1. 定义好要使用的 【fileName】和【key】,这些不让外部随意指定

  2. 将每个【key】对应的存取操作其封装成 get 和 set 方法

  3. 简化掉【fileName】

(3)MyApplication + CommonStore
  1. 扩展 SPStore 中的 get 和 set 方法(减少对 SharedPreferences 文件的直接操作、更灵活的定义默认值),同时传入 context

  2. 简化掉【context】


二、SharedPreferences 框架体系具体实现

1、SharedPreferences 工具类
  • MySPTool.java
/*** SharedPreferences 工具类*/
public class MySPTool {/*** 存 String 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @param value    键值*/public static void setString(Context context, String fileName, String key, String value) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);SharedPreferences.Editor edit = sharedPreferences.edit();edit.putString(key, value);edit.commit();}/*** 取 String 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @return*/public static String getString(Context context, String fileName, String key) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);return sharedPreferences.getString(key, "");}// ----------------------------------------------------------------------------------------------------/*** 存 int 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @param value    键值*/public static void setInt(Context context, String fileName, String key, int value) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);SharedPreferences.Editor edit = sharedPreferences.edit();edit.putInt(key, value);edit.commit();}/*** 取 int 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @return*/public static int getInt(Context context, String fileName, String key) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);return sharedPreferences.getInt(key, -1);}// ----------------------------------------------------------------------------------------------------/*** 存 float 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @param value    键值*/public static void setFloat(Context context, String fileName, String key, float value) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);SharedPreferences.Editor edit = sharedPreferences.edit();edit.putFloat(key, value);edit.commit();}/*** 取 float 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @return*/public static float getFloat(Context context, String fileName, String key) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);return sharedPreferences.getFloat(key, -1);}// ----------------------------------------------------------------------------------------------------/*** 存 boolean 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键名* @param value    键值*/public static void setBoolean(Context context, String fileName, String key, boolean value) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);SharedPreferences.Editor edit = sharedPreferences.edit();edit.putBoolean(key, value);edit.commit();}/*** 取 boolean 类型的数据** @param context  上下文对象* @param fileName 文件名* @param key      键值* @return*/public static boolean getBoolean(Context context, String fileName, String key) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);return sharedPreferences.getBoolean(key, false);}// ----------------------------------------------------------------------------------------------------/*** 删除数据** @param context  上下文对象* @param fileName 文件名* @param key      键名*/public static void remove(Context context, String fileName, String key) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);SharedPreferences.Editor edit = sharedPreferences.edit();edit.remove(key);edit.commit();}/*** 删除所有数据** @param fileName 文件名* @param context  上下文对象*/public static void clear(Context context, String fileName) {SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);SharedPreferences.Editor edit = sharedPreferences.edit();edit.clear();edit.commit();}
}
2、SPStore
  • SPStore.java
public class SPStore {private static final String SP_NAME = "test";// ----------------------------------------------------------------------------------------------------private static final String NAME_KEY = "name";private static final String AGE_KEY = "age";// ====================================================================================================public static String getName(Context context) {return MySPTool.getString(context, SP_NAME, NAME_KEY);}public static void setName(Context context, String name) {MySPTool.setString(context, SP_NAME, NAME_KEY, name);}public static int getAge(Context context) {return MySPTool.getInt(context, SP_NAME, AGE_KEY);}public static void setAge(Context context, int age) {MySPTool.setInt(context, SP_NAME, AGE_KEY, age);}
}
3、MyApplication + CommonStore
  1. MyApplication.java
public class MyApplication extends Application {public static final String TAG = MyApplication.class.getSimpleName();private static Context context;@Overridepublic void onCreate() {super.onCreate();context = this;}public static Context getContext() {return context;}
}
  1. CommonStore.java
public class CommonStore {private static String name;private static Integer age;// ====================================================================================================public static String getName() {if (name == null) {String spName = SPStore.getName(MyApplication.getContext());name = spName;}return name;}public static void setName(String inputName) {SPStore.setName(MyApplication.getContext(), inputName);name = inputName;}public static Integer getAge() {if (age == null) {int spAge = SPStore.getAge(MyApplication.getContext());if (spAge == -1) spAge = 0;age = spAge;}return age;}public static void setAge(Integer inputAge) {SPStore.setAge(MyApplication.getContext(), inputAge);age = inputAge;}
}
4、测试
  1. activity_sp_test.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".SpTestActivity"tools:ignore="MissingConstraints"><LinearLayoutandroid:id="@+id/ll_content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="vertical"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"><EditTextandroid:id="@+id/et_name"android:layout_width="200dp"android:layout_height="wrap_content"android:inputType="text" /><EditTextandroid:id="@+id/et_age"android:layout_width="200dp"android:layout_height="wrap_content"android:inputType="number" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_btns"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/ll_content"><Buttonandroid:id="@+id/btn_read"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="读取" /><Buttonandroid:id="@+id/btn_write"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="10dp"android:text="写入" /></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
  1. SpTestActivity.java
public class SpTestActivity extends AppCompatActivity {private Button btnRead;private Button btnWrite;private EditText etName;private EditText etAge;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sp_test);btnRead = findViewById(R.id.btn_read);btnWrite = findViewById(R.id.btn_write);etName = findViewById(R.id.et_name);etAge = findViewById(R.id.et_age);btnRead.setOnClickListener(v -> {String name = CommonStore.getName();Integer age = CommonStore.getAge();etName.setText(name);etAge.setText(String.valueOf(age));});btnWrite.setOnClickListener(v -> {String inputName = etName.getText().toString();if (inputName == null || inputName.equals("")) {Toast.makeText(this, "存入的 name 不合法", Toast.LENGTH_SHORT).show();return;}String inputAgeStr = etAge.getText().toString();int inputAge = -1;try {inputAge = Integer.parseInt(inputAgeStr);} catch (NumberFormatException e) {e.printStackTrace();}if (inputAge < 0) {Toast.makeText(this, "存入的 age 不合法", Toast.LENGTH_SHORT).show();return;}CommonStore.setName(inputName);CommonStore.setAge(inputAge);});}
}

相关文章:

Android 存储之 SharedPreferences 框架体系编码模板

一、SharedPreferences 框架体系 1、SharedPreferences 基本介绍 SharedPreferences 是 Android 的一个轻量级存储工具&#xff0c;它采用 key - value 的键值对方式进行存储 它允许保存和读取应用中的基本数据类型&#xff0c;例如&#xff0c;String、int、float、boolean …...

弹性容器Flex中的自动外边距(Auto Margins) 的作用

最近在使用Flex布局时&#xff0c;遇到的一个情况&#xff1a; 有以下的代码&#xff1a; <div class"toolbox"><button id"decrease">-</button><span id"size">1</span><button id"increase">…...

C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例

0 参考资料&工具 Cortex M3权威指南(中文).pdf keil5&#xff08;用于仿真查看寄存器、栈变化&#xff09;1 C语言调用子函数时出入/出栈&#xff08;保护/恢复现场&#xff09;全过程分析 使用C语言调用子函数是如何保护/恢复现场的呢&#xff1f;本文以Cortex-M3为例&a…...

理解Sigmoid激活函数原理和实现

Sigmoid 激活函数是一种广泛应用于机器学习和深度学习中的非线性函数&#xff0c;特别是在二分类问题中。它的作用是将一个实数值映射到(0, 1)区间&#xff0c;使得输出可以被解释为概率值&#xff0c;这在处理二分类问题时非常有用。 Sigmoid 函数的定义 Sigmoid 函数的数学…...

探秘DevSecOps黄金管道,安全与效率的完美融合

软件应用的安全性已成为企业和用户关注的焦点&#xff0c;DevSecOps作为一种将安全融入开发和运维全过程的理念和实践&#xff0c;旨在消除传统开发模式中安全被后置处理的弊端。DevSecOps黄金管道&#xff08;Golden Pipeline&#xff09;是实现这一理念的核心框架&#xff0c…...

Redis的内存淘汰策略- volatile-lru

volatile-lru 策略简介 在 volatile-lru 策略下&#xff0c;当 Redis 的内存使用达到配置的上限&#xff08;maxmemory&#xff09;时&#xff0c;它会优先删除那些设置了过期时间的键&#xff0c;并且选择最近最少使用的键进行删除。LRU 算法的核心思想是&#xff0c;优先删除…...

HTTP和HTTPS的区别?哪一个更适合你的网站?

什么是 HTTP&#xff1f; HTTP&#xff08;超文本传输协议&#xff09;&#xff08;Hypertext Transfer Protocol&#xff09;它是一组允许网络浏览器与网络服务器&#xff08;托管网站的计算机&#xff09;进行通信的规则。 HTTP 使用请求-响应模型。 例如&#xff0c;当你…...

OpenAI SORA团队负责人 通往智能的方式 报告笔记

OpenAI SORA团队负责人 通往智能的方式 报告笔记 这个报告其实是2024年智源大会的主旨报告&#xff0c;OpenAI SORA和DALL-E团队负责人Aditya Ramesh给出的一段有关多模态大模型的报告。我去听了现场&#xff0c;感觉倍受启发&#xff0c;但是感觉很多并不能当场理解&#xff…...

006-Sleuth(Micrometer)+ZipKin分布式链路追踪

这里写目录标题 1 分布式链路追踪概述1.1 为什么会出现这个技术&#xff1f;需要解决哪些问题&#xff1f;1.2 在分布式与微服务场景下需要解决的问题 2 新一代Spring Cloud Sleuth&#xff1a;Micrometer2.1 官网重要提示2.1.1 新一代Sleuth2.1.2 官网2.1.3 说明2.1.3.1 老项目…...

AI模型:追求全能还是专精?-- 之6 语言复杂度类别(Category 0~3 类)和语言功能性类型(Type 0~Ⅲ 型)之2

Q17、我前面说过&#xff0c;语言复杂度的0~3级&#xff08;Category 0~3&#xff09;表示了语言的的上下文相关性 &#xff1a; 完全不相关&#xff0c; 单相关的 单词上下文&#xff0c; 双相关的句子上下文 全相关的文章上下文 。我准备翻译为 Context - irrelative /relati…...

20240907 每日AI必读资讯

大疆发布 DJI Neo 掌上 Vlog 无人机&#xff01; - DJI Neo 是 DJI 迄今最轻、最小的无人机&#xff0c;无需遥控器&#xff0c;掌上起降即可轻松拍出主角大片… &#xff5c;135 克轻巧便携 丨零门槛掌上起降 丨AI 智能跟拍 &#xff0c;一键成片 丨多种操控&#xff0c;丰富…...

深度学习基础--卷积基础模块

本节主要关注卷积神经网络发展过程中具有里程碑意义的基础模块&#xff0c;了解它们的原理和设计细节 1. 批归一化 在机器学习中&#xff0c;一般会假设模型的输入数据的分布是稳定的。如果这个假设不成立&#xff0c;即模型输入数据的分布发生变化&#xff0c;则称为协变量偏…...

视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍

随着智能手机的普及&#xff0c;手机已成为人们生活中不可或缺的一部分。然而&#xff0c;在某些场合&#xff0c;如驾驶、会议、学校课堂等&#xff0c;不当使用手机可能会导致安全隐患或干扰他人。因此&#xff0c;开发出一种能够准确识别并阻止不当使用手机的行为检测算法显…...

6.2图的存储及基本操作

6.2.1顺序存储 邻接矩阵法,用一个一维数组存储图中顶点信息,二维数组存储图中边的信息 无向图 1.无向图的邻接矩阵关于对角线对称,可采用压缩存储 2.边数为e,则邻接矩阵中1为2e; 3.第i行or 第i列非零元素之和恰好为顶点i的度数 4.判断是否有边用0,1 5. 有向图 1.关于对…...

Java语法全解析:掌握基本规则,打造稳固编程基础!

Java基本语法是编写Java程序的核心&#xff0c;它包括了数据类型、运算符、控制结构、类与对象等基本组成部分。这些语法要素共同构成了Java程序的基础框架&#xff0c;掌握它们是进行Java编程的前提。以下是Java基本语法的详细介绍&#xff1a; 数据类型 基本数据类型&#x…...

同时播放多个视频

介绍一款小众的视频播放器&#xff0c;之前有小伙伴找那种可以同时播放多个视频的软件&#xff0c;“恒硕加播放”可以做到这一点&#xff0c;功能不是太多&#xff0c;但是日常播放是足够了。 同时播放多个视频控制多个视频跳到指定进度同时暂停/播放/停止/静音/倍速浏览系统…...

伴奏提取消除人声如何操作?轻松几步玩转音乐世界

你是否梦想着独自演绎一曲&#xff0c;或是进行个性化的混音创作&#xff0c;却又希望摆脱原唱声音的干扰&#xff1f;那么&#xff0c;学会免费伴奏提取就显得尤为关键。 在这篇文章中&#xff0c;我将为你展示四种简单易学的方法&#xff0c;让你能够轻松地从歌曲中提取出伴…...

uniapp二维码生成

uniapp二维码生成 参考文档依赖引入代码html部分生成代码&#xff08;vue3 hook&#xff09;使用 参考文档 【博主&#xff1a;ChoneyLove】uniapp中生成二维码及解决微信小程序端问题总结 依赖引入 npm i uqrcodejs代码 html部分 <canvas type"2d" id"…...

Android UID 和 userID 以及 appID

我们知道Android 操作系统是基于Linux内核的&#xff0c;所以Android 的UID 是基于 Linux UID的。 Linux UID Linux 本身就是一个多用户操作系统&#xff0c;每一个用户都会有一个UID&#xff0c;不同UID 之间的资源访问是受限的。 其中&#xff0c;Linux的DAC权限模型&#…...

Kafka的三高设计原理

1.生产者缓存机制--高性能 生产者缓存机制的主要目的是将消息打包&#xff0c;减少网络IO频率 kafka生产者端存在消息累加器RecordAccumulator&#xff0c;它会对每个Partition维护一个双端队列&#xff0c;队列中消息到达一定数量后 或者 到达一定时间后&#xff0c;通过sen…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...