Android 存储之 SharedPreferences 框架体系编码模板
一、SharedPreferences 框架体系
1、SharedPreferences 基本介绍
-
SharedPreferences 是 Android 的一个轻量级存储工具,它采用
key - value的键值对方式进行存储 -
它允许保存和读取应用中的基本数据类型,例如,String、int、float、boolean 等
-
保存共享参数键值对信息的文件路径为:
/data/data/【应用包名】/shared_prefs/【SharedPreferences 文件名】.xml
2、SharedPreferences 使用步骤
(1)获取 SharedPreferences 实例
-
其中,fileName 是为 SharedPreferences 文件指定的名称
-
mode 是文件的操作模式,通常是
MODE_PRIVATE(私有模式)
SharedPreferences sharedPreferences = context.getSharedPreferences(【fileName】, 【mode】);
(2)写入数据
-
使用
SharedPreferences.Editor来编辑数据,通过 SharedPreferences 实例的 edit 方法获取 Editor 对象 -
然后使用 put 相关方法来添加或修改数据,当
key - value不存在时为添加,当key - value存在时为修改 -
最后调用 commit 方法来提交更改
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putString(【key】, 【value】);
edit.commit();
(3)读取数据
-
通过 SharedPreferences 实例的 get 相关方法来读取数据
-
如果 key 不存在,则返回 defValue 默认值
sharedPreferences.getString(【key】, 【defValue】);
3、SharedPreferences 使用优化思路
-
在使用 SharedPreferences 时,我们往往只关注一存一取,即我们往往只关注【key】和【value】
-
我们往往不关注【context】、【fileName】、【mode】、【defValue】,在使用一一指定这些感觉过于繁琐
4、SharedPreferences 框架体系
- 使用 SharedPreferences 框架体系,可以优化 SharedPreferences 的使用,增强 SharedPreferences 相关业务代码的可维护性,SharedPreferences 框架体系分为以下三部分
(1)SharedPreferences 工具类
-
封装原始的 SharedPreferences 操作(存、取)
-
简化掉【mode】和【defValue】
(2)SPStore
-
定义好要使用的 【fileName】和【key】,这些不让外部随意指定
-
将每个【key】对应的存取操作其封装成 get 和 set 方法
-
简化掉【fileName】
(3)MyApplication + CommonStore
-
扩展 SPStore 中的 get 和 set 方法(减少对 SharedPreferences 文件的直接操作、更灵活的定义默认值),同时传入 context
-
简化掉【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
- 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;}
}
- 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、测试
- 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>
- 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 的一个轻量级存储工具,它采用 key - value 的键值对方式进行存储 它允许保存和读取应用中的基本数据类型,例如,String、int、float、boolean …...
弹性容器Flex中的自动外边距(Auto Margins) 的作用
最近在使用Flex布局时,遇到的一个情况: 有以下的代码: <div class"toolbox"><button id"decrease">-</button><span id"size">1</span><button id"increase">…...
C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例
0 参考资料&工具 Cortex M3权威指南(中文).pdf keil5(用于仿真查看寄存器、栈变化)1 C语言调用子函数时出入/出栈(保护/恢复现场)全过程分析 使用C语言调用子函数是如何保护/恢复现场的呢?本文以Cortex-M3为例&a…...
理解Sigmoid激活函数原理和实现
Sigmoid 激活函数是一种广泛应用于机器学习和深度学习中的非线性函数,特别是在二分类问题中。它的作用是将一个实数值映射到(0, 1)区间,使得输出可以被解释为概率值,这在处理二分类问题时非常有用。 Sigmoid 函数的定义 Sigmoid 函数的数学…...
探秘DevSecOps黄金管道,安全与效率的完美融合
软件应用的安全性已成为企业和用户关注的焦点,DevSecOps作为一种将安全融入开发和运维全过程的理念和实践,旨在消除传统开发模式中安全被后置处理的弊端。DevSecOps黄金管道(Golden Pipeline)是实现这一理念的核心框架,…...
Redis的内存淘汰策略- volatile-lru
volatile-lru 策略简介 在 volatile-lru 策略下,当 Redis 的内存使用达到配置的上限(maxmemory)时,它会优先删除那些设置了过期时间的键,并且选择最近最少使用的键进行删除。LRU 算法的核心思想是,优先删除…...
HTTP和HTTPS的区别?哪一个更适合你的网站?
什么是 HTTP? HTTP(超文本传输协议)(Hypertext Transfer Protocol)它是一组允许网络浏览器与网络服务器(托管网站的计算机)进行通信的规则。 HTTP 使用请求-响应模型。 例如,当你…...
OpenAI SORA团队负责人 通往智能的方式 报告笔记
OpenAI SORA团队负责人 通往智能的方式 报告笔记 这个报告其实是2024年智源大会的主旨报告,OpenAI SORA和DALL-E团队负责人Aditya Ramesh给出的一段有关多模态大模型的报告。我去听了现场,感觉倍受启发,但是感觉很多并不能当场理解ÿ…...
006-Sleuth(Micrometer)+ZipKin分布式链路追踪
这里写目录标题 1 分布式链路追踪概述1.1 为什么会出现这个技术?需要解决哪些问题?1.2 在分布式与微服务场景下需要解决的问题 2 新一代Spring Cloud Sleuth:Micrometer2.1 官网重要提示2.1.1 新一代Sleuth2.1.2 官网2.1.3 说明2.1.3.1 老项目…...
AI模型:追求全能还是专精?-- 之6 语言复杂度类别(Category 0~3 类)和语言功能性类型(Type 0~Ⅲ 型)之2
Q17、我前面说过,语言复杂度的0~3级(Category 0~3)表示了语言的的上下文相关性 : 完全不相关, 单相关的 单词上下文, 双相关的句子上下文 全相关的文章上下文 。我准备翻译为 Context - irrelative /relati…...
20240907 每日AI必读资讯
大疆发布 DJI Neo 掌上 Vlog 无人机! - DJI Neo 是 DJI 迄今最轻、最小的无人机,无需遥控器,掌上起降即可轻松拍出主角大片… |135 克轻巧便携 丨零门槛掌上起降 丨AI 智能跟拍 ,一键成片 丨多种操控,丰富…...
深度学习基础--卷积基础模块
本节主要关注卷积神经网络发展过程中具有里程碑意义的基础模块,了解它们的原理和设计细节 1. 批归一化 在机器学习中,一般会假设模型的输入数据的分布是稳定的。如果这个假设不成立,即模型输入数据的分布发生变化,则称为协变量偏…...
视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍
随着智能手机的普及,手机已成为人们生活中不可或缺的一部分。然而,在某些场合,如驾驶、会议、学校课堂等,不当使用手机可能会导致安全隐患或干扰他人。因此,开发出一种能够准确识别并阻止不当使用手机的行为检测算法显…...
6.2图的存储及基本操作
6.2.1顺序存储 邻接矩阵法,用一个一维数组存储图中顶点信息,二维数组存储图中边的信息 无向图 1.无向图的邻接矩阵关于对角线对称,可采用压缩存储 2.边数为e,则邻接矩阵中1为2e; 3.第i行or 第i列非零元素之和恰好为顶点i的度数 4.判断是否有边用0,1 5. 有向图 1.关于对…...
Java语法全解析:掌握基本规则,打造稳固编程基础!
Java基本语法是编写Java程序的核心,它包括了数据类型、运算符、控制结构、类与对象等基本组成部分。这些语法要素共同构成了Java程序的基础框架,掌握它们是进行Java编程的前提。以下是Java基本语法的详细介绍: 数据类型 基本数据类型&#x…...
同时播放多个视频
介绍一款小众的视频播放器,之前有小伙伴找那种可以同时播放多个视频的软件,“恒硕加播放”可以做到这一点,功能不是太多,但是日常播放是足够了。 同时播放多个视频控制多个视频跳到指定进度同时暂停/播放/停止/静音/倍速浏览系统…...
伴奏提取消除人声如何操作?轻松几步玩转音乐世界
你是否梦想着独自演绎一曲,或是进行个性化的混音创作,却又希望摆脱原唱声音的干扰?那么,学会免费伴奏提取就显得尤为关键。 在这篇文章中,我将为你展示四种简单易学的方法,让你能够轻松地从歌曲中提取出伴…...
uniapp二维码生成
uniapp二维码生成 参考文档依赖引入代码html部分生成代码(vue3 hook)使用 参考文档 【博主:ChoneyLove】uniapp中生成二维码及解决微信小程序端问题总结 依赖引入 npm i uqrcodejs代码 html部分 <canvas type"2d" id"…...
Android UID 和 userID 以及 appID
我们知道Android 操作系统是基于Linux内核的,所以Android 的UID 是基于 Linux UID的。 Linux UID Linux 本身就是一个多用户操作系统,每一个用户都会有一个UID,不同UID 之间的资源访问是受限的。 其中,Linux的DAC权限模型&#…...
Kafka的三高设计原理
1.生产者缓存机制--高性能 生产者缓存机制的主要目的是将消息打包,减少网络IO频率 kafka生产者端存在消息累加器RecordAccumulator,它会对每个Partition维护一个双端队列,队列中消息到达一定数量后 或者 到达一定时间后,通过sen…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
