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

news2024/12/26 13:42:55

一、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;

    @Override
    public 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">

    <LinearLayout
        android: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">

        <EditText
            android:id="@+id/et_name"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:inputType="text" />

        <EditText
            android:id="@+id/et_age"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:inputType="number" />
    </LinearLayout>

    <LinearLayout
        android: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">

        <Button
            android:id="@+id/btn_read"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="读取" />

        <Button
            android: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;

    @Override
    protected 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);
        });
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RKNPU2项目实战【1】 ---- YOLOv5实时目标分类

目录 目标 一、python接口下实现yolov5模型在开发板上的部署 1.1 在rknntoolkit2环境下模拟实现yolov5模型在RK3588开发板上的推理测试 1.2 在rknntoolkit2环境下实现模型在RK3588开发板上的连板推理测试&#xff08;模型运行在NPU上&#xff09; 1.3 在rknntoolkitlite2环…

使用llamaindexLLM大模型构建一个可离线可在线可异步扩展信息的RAG智能问答系统

之前对一件事很好奇,为什么去年训练的大模型可以回答今天的新闻内容。答案是使用了知识扩展系统。基本原理是把参考答案和问题一同提给大模型,给他充分的参考信息做回复编辑。 本文教你完成离线版本的智能问答系统搭建。 最近在疯狂找下家,本人精通图形渲染和ai,求捞啊! …

没参加会议,还要 30000 字的会议材料写总结?用好 AI工具,30 分钟堵住领导的嘴

前段时间本来要参加总公司的重要会议&#xff0c;但由于临时出差错过了。 分公司老总&#xff0c;给了我 10 份会议材料内容&#xff0c;让我学习&#xff0c;并在节后梳理出要点。 结果&#xff0c;一过节就全都给忘记了&#xff0c;咋办&#xff1f;听说最近Kimi出了新玩法…

k8s 部署 jenkins【详细步骤】

文章目录 部署介绍部署步骤第 1 步:创建 namespace第 2 步:创建 ServiceAccount第 3 步:创建持久卷第 4 步:创建 Deployment第 5 步:创建 Service第 6 步:浏览器访问 Jenkins第 7 步:修改默认时区参考⭐ 本文目标:在 k8s 集群中部署一个 jenkins。 部署介绍 🚀 在 K…

内推|京东|后端开发|运维|算法...|北京 更多岗位扫内推码了解,直接投递,跟踪进度

热招岗位 更多岗位欢迎扫描末尾二维码&#xff0c;小程序直接提交简历等面试。实时帮你查询面试进程。 安全运营中心研发工程师 岗位要求 1、本科及以上学历&#xff0c;3年以上的安全相关工作经验&#xff1b; 2、熟悉c/c、go编程语言之一、熟悉linux网络编程和系统编程 3、…

coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

为什么企业数据资产入表实践少?

​在财政部会计司发布暂行规定之后&#xff0c;数据资产化或者数据要素市场进入加速期。 会计司在22年12月1号首先发布征求意见&#xff0c;经过半年时间迅速迭代后&#xff0c;正式发布了暂行规定。文件第8条规定了国家实行统一的会计制度&#xff0c;任何相关的企业组织都必须…

【网络安全】调试模式获取敏感数据

未经许可,不得转载。 文章目录 漏洞原因步骤PHPPythonASPNode.js漏洞原因 当开发者忘记在生产环境中禁用调试模式,应用在发生错误时,可能会输出详细的错误信息。这些错误信息(比如“error title”或堆栈跟踪)通常包含了应用程序的内部结构、配置甚至数据库连接信息等敏感…

Windows自动化程序开发指南

自动化程序的概念 “自动化程序”指的是通过电脑编程来代替人类手工操作的一类程序或软件。这类程序具有智能性高、应用范围广的优点&#xff0c;但是自动化程序的开发难度大、所用技术杂。 本文对自动化程序开发的各个方面进行讲解。 常见的处理对象 自动化程序要处理的对…

公认最好的跑步耳机分享,选购骨传导运动耳机需注意的五大陷阱!

跑步&#xff0c;不仅是一种锻炼身体的方式&#xff0c;更是一种生活态度的体现。它让我们在汗水中释放压力&#xff0c;在节奏中感受生命的律动。而音乐&#xff0c;作为跑步时的完美伴侣&#xff0c;能够激发我们的运动潜能&#xff0c;让我们的跑步之旅更加愉悦。因此&#…

软件测试自动化面试题(含答案)

1.如何把自动化测试在公司中实施并推广起来的&#xff1f; 选择长期的有稳定模块的项目 项目组调研选择自动化工具并开会演示demo案例&#xff0c;我们主要是演示selenium和robot framework两种。 搭建自动化测试框架&#xff0c;在项目中逐步开展自动化。 把该项目的自动化…

示波器基础知识汇总(2)

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定时更新&#xff09; 中国计算机技术职业资格网 上海市工程系列计算机专…

SD-WAN解决企业远程服务难题

在当今数字化和全球化的商业环境中&#xff0c;企业不再受限于地理位置。远程工作和分布式团队已成为常态&#xff0c;但随之而来的是对网络连接的更高需求。本文将讨论企业远程服务中的挑战&#xff0c;并介绍一个解决这些挑战的有效方案——SD-WAN。 随着远程工作的增加&…

Buzzer:一款针对eBPF的安全检测与模糊测试工具

关于Buzzer Buzzer是一款功能强大的模糊测试工具链&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员简单高效地开发针对eBPF的模糊测试策略。 功能介绍 下面给出的是当前版本的Buzzer整体架构&#xff1a; 元素解析&#xff1a; 1、ControlUnit&#xff1a…

查看元神操作系统的版本

1. 背景 本文通过元神操作系统的API调用来获取元神系统的版本&#xff0c;并显示在屏幕上。 2. 方法 &#xff08;1&#xff09;编写程序 本例先设置系统调用的参数&#xff1a;第一个参数设置为API_OS_VER&#xff0c;表示获取元神操作系统的版本号&#xff1b;第二个参数…

pdf怎么压缩小一些?推荐的几种PDF压缩方法

pdf怎么压缩小一些&#xff1f;在工作中&#xff0c;我们经常处理PDF文件。大文件不仅存储麻烦&#xff0c;还会拖慢传输速度。因此&#xff0c;我们通常希望将这些文件压缩成更小的尺寸。压缩后的文件更便于分享和管理&#xff0c;适用于云存储、社交媒体或其他在线平台&#…

安装node版本管理工具(nvm)、利用nvm安装node

https://github.com/coreybutler/nvm-windows/releases 下载nvm-setup.zip 选择nvm安装路径&#xff0c;注意路径不要有空格和中文。 选择nodejs的安装路径&#xff0c;这里是在E:\nodejs位置创建一个快捷方式&#xff0c;真正的文件在nvm文件下的版本号文件中 点击next&a…

容性负载箱如何测量电容器的容量、电压、泄漏电流和ESR等参数?

容性负载箱是用于测量电容器参数的重要设备。它的主要功能是通过向电容器施加不同的负载&#xff0c;从而测量电容器的容量、电压响应、损耗等关键参数。 具体来说&#xff0c;容性负载箱可以通过以下方式测量电容器的各项参数&#xff1a; 1. 测量电容器的容量&#xff1a;容…

并发工具类(二):CyclicBarrier

1、CyclicBarrier 介绍 从字面上看 CyclicBarrier 就是 一个循环屏障&#xff0c;它也是一个同步助手工具&#xff0c;它允许多个线程 在执行完相应的操作后彼此等待共同到达一个屏障点。 CyclicBarrier可以被循环使用&#xff0c;当屏障点值变为0之后&#xff0c;可以在接下来…

qt配合halcon深度学习网络环境配置

1.开发环境qt6&#xff0c;编译器MSCV2019&#xff0c;网络是halcon的对象检测&#xff0c;halcon用20. 2.建立qt项目 3.到halcon安装目录下复制include,lib这两个文件夹到qt项目中进行引用 4.引用到halcon静态库后&#xff0c;到halcon运行目录下找到静态库对应dll文件&…