展开说说:Android之SharedPreferences

        SharedPreferences 是一种轻量级的数据持久化存储机制。以key/value键值形式存储在xml文件,用于保存一些应用程序数据。保存/data/data/PACKAGE_NAME/shared_prefs/xxx.Xml文件

SharedPreferences 只能存储string,int,float,long和boolean五个基本数据类型。如果需要存取比较复杂的数据类型,则需要对这些数据进行序列化这一点通过源码可以看到SharedPreferences是个接口它的内部接口是Editor,里面定义了上面五个数据类型的put方法,以及putString、remove、clear、commit、apply方法。

上面可以看出getxx方法不在Edit接口中,他们是在SharedPreferences

父级接口定义的,因此增加、删除、清空方法需要使用edit但get方法不用,下面距离分别验证这些方法。另外下面还有个是检查当前键是否存在可以返回所有可用的键值两个方法。

  1. 布局定义了一些按钮
  1. 定义getSharedPreferences工具类
  2. private static SharedPreferences preferences;
    public static final String SPNAME = "appSpName";
    
    public static void putString(String key,String value){
        getSP().edit().putString(key,value).apply();
        Log.e(TAG, "putString: "+ getString(key,"你太着急了"));
    }
    public static String getString(String key,String defaultValue){
        return getSP().getString(key, defaultValue);
    }
    
    
    public static void putInt(String key,int value){
        getSP().edit().putInt(key,value).apply();
    }
    public static int getInt(String key,int defaultValue){
        return getSP().getInt(key, defaultValue);
    }
    
    
    public static void putBoolean(String key,boolean value){
        getSP().edit().putBoolean(key,value).apply();
    }
    public static boolean getBoolean(String key,boolean defaultValue){
        return getSP().getBoolean(key, defaultValue);
    }
    
    
    public static void putFloat(String key,float value){
        getSP().edit().putFloat(key,value).apply();
    }
    public static float getFloat(String key,float defaultValue){
        return getSP().getFloat(key, defaultValue);
    }
    
    
    public static void putLong(String key,long value){
        getSP().edit().putLong(key,value).apply();
    }
    public static long getLong(String key,long defaultValue){
        return getSP().getLong(key, defaultValue);
    }
    
    /**
     * 根据key值删除指定元素,各类型通用因为大家的key都是String
     * @param key
     */
    public static void deleteValue(String key){
        getSP().edit().remove(key).apply();
    }
    
    /**
     * 清空了,创建这个sharedpreference所有的
     */
    public static void clearAll(){
        getSP().edit().clear().apply();
    }
    
    /**
     * 清空了,创建这个sharedpreference所有的
     */
    public static boolean containsKey(String key){
        getSP().edit().clear().apply();
        //检查当前键是否存在
        boolean isContains=getSP().contains(key);
        Log.e(TAG, "containsKey: isContains= "+isContains );
        //使用getAll可以返回所有可用的键值
        Map<String,?> keyMap=getSP().getAll();
        if (!keyMap.isEmpty()){
            Set<String> keySet = keyMap.keySet();
            for (String myKey: keySet){
                Log.e(TAG, "containsKey: myKey= "+myKey );
            }
        }
    
        return isContains;
    }
    
    public static SharedPreferences getSP(){
        if (preferences == null){
            preferences = BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE);
        }
        return preferences;
    }

    注意:

    2.1 BaseApplication.getContext().getSharedPreferences(SPNAME, Context.MODE_PRIVATE);

    getSharedPreferences方法传入的操作模式
    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
    Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
    特别注意:还有两个MODE_WORLD_READABLE MODE_WORLD_WRITEABLE我们不需要学习了,他们 用来控制其他应用是否有权限读写该文件,Android 4.2版本中已经被弃用

    2.2 applycommit前者是异步后者是同步方法。apply方法时在Android API level 9中引入的,调用它会安全的异步写入SharedPreference Editor当下首选方法。

  3. 定义按钮的点击事件并调用这个工具类
  4. @Override
    public void onClick(View v) {
        int clickId = v.getId();
        if (clickId == R.id.asyncAct_putString){
            SpUtil.putString("name","张三");
        }else if (clickId == R.id.asyncAct_getString){
            String name = SpUtil.getString("name", "无名");
            String name1 = SpUtil.getString("name1", "无名");
            Log.e(TAG, "getString: name= "+ name +"    name1= "+name1);
        }else if (clickId == R.id.asyncAct_putBoolean){
            SpUtil.putBoolean("isBoy",true);
        }else if (clickId == R.id.asyncAct_getBoolean){
            boolean isBoy = SpUtil.getBoolean("isBoy", false);
            Log.e(TAG, "getBoolean: isBoy= "+isBoy);
        }else if (clickId == R.id.asyncAct_putInt){
            SpUtil.putInt("age",18);
        }else if (clickId == R.id.asyncAct_getInt){
            int age = SpUtil.getInt("age", -1);
            Log.e(TAG, "getInt:   age= "+age);
        }else if (clickId == R.id.asyncAct_putFloat){
            SpUtil.putFloat("height",177.7F);
        }else if (clickId == R.id.asyncAct_getFloat){
            float height = SpUtil.getFloat("height", 0.00F);
            Log.e(TAG, "getFloat: height= "+height );
        }else if (clickId == R.id.asyncAct_putLong){
            SpUtil.putLong("weight",70L);
        }else if (clickId == R.id.asyncAct_getLong){
            long weight = SpUtil.getLong("weight", 0L);
            Log.e(TAG, "getLong: weight= "+weight );
        }else if (clickId == R.id.asyncAct_clearAll){
            SpUtil.clearAll();
        } else if (clickId == R.id.asyncAct_containsKey){
            SpUtil.containsKey("weight");
        }
    }

  5. 一些小提醒
    1. 应用程序一旦卸载或者通过手机设置页面清缓存,SharedPreference也会被删除。
    2. 在实际开发者很多会涉及敏感数据,针对敏感数据我们呢需要对其加密后再进行存储,取数据也是先解密再使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战!wsl 与主机网络通信,在 wsl 中搭建服务器。学了计算机网络,但只能刷刷面试题?那也太无聊了!这篇文章可以让你检测你的计网知识!

前言&#xff08;碎碎念&#xff09;&#xff1a;每次发布文章时&#xff0c;我都是一个纠结的过程。因为我给自己写笔记时&#xff0c;只需要记录自己不清晰或者易忘的知识点就可以了&#xff0c;但一旦想要作为文章发布&#xff0c;那么我就得考虑到很多人是纯新手&#xff0…

【Git】本地仓库关联远程仓库

Git 本地项目关联远程仓库 本地 本地已有项目 ● 项目 07.GitLocalTest 包含有一个js ○ test.js 远程仓库 ● 远程仓库地址 ○ https://github.com/Sonnenlicht77/gitTest.git ○ 仓库只有一个 readme.md 关联 1.本地 1.1 本地仓库 ● git init ● git add . ● gi…

[Node.js] Node.js 版本控制工具 nvm/n/fnm

文章目录 Node.jsNode.js 版本控制工具介绍nvm (Node Version Manager)nfnm (Fast Node Manager) Node.js Node.js 是一个开源与跨平台的 JavaScript 运行环境&#xff0c;它允许 JavaScript 运行&#xff0c; Node.js 使用事件驱动、非阻塞的 I/O 模型&#xff0c;使其轻量且…

HSE化工应急安全生产管理平台:衢州某巨大型化工企业的成功应用

在化工行业中&#xff0c;安全生产一直是至关重要的议题。为了提高生产安全性、降低成本并提升企业形象&#xff0c;衢州某巨大型化工企业引入了HSE化工应急安全生产管理平台&#xff0c;取得了显著的改善和获益。 该平台的核心功能包括风险管理和应急预案制定。通过对化工生产…

JVM学习-垃圾回收专题

目录 1.如何判断对象可以回收 1.1引用计数法 1.2可达性分析算法 1.3五种引用 1.4拓展&#xff1a;直接内存 2.垃圾回收算法 2.1标记清除算法 2.2标记整理算法 2.3复制 3.分代垃圾回收 3.垃圾回收器 3.1串行垃圾回收器 3.2吞吐量优先垃圾回收器 3.3响应时间优先垃圾回收器…

51单片机-AT24C02(I2C总线)

目录 一&#xff0c;介绍及元件工作原理 7.时序结构&#xff08;重要&#xff09; 8.i2C总线数据帧&#xff08;重要&#xff09; 二&#xff0c;应用 一&#xff0c;介绍及元件工作原理 1.元件介绍 2.存储器 3.地址总线和数据总线 地址总线只能一次选中一行 4.引脚及应用…

python之自动化(django)

1、安装 我用的是pip install Django 在命令行中安装 然后django-admin startproject autotext&#xff08;在命令行中&#xff09; 这句话是创建一个django 项目 然后切换到你所创建项目的目录下 输入&#xff1a; python manage.py runserver 当你出现以下错误时 You…

[沉淀之华] 自研基于SpringBoot Mybaits 构建低代码数据治理脚手架分享:涵盖数据同步、数据比对、数据归档、数据恢复为一体

文章目录 成果演示背景整体能力功能描述相关细节安装使用 成果演示 Github地址&#xff1a;数据治理脚手架 wiki&#xff1a;kg-ctl-core使用文档 背景 为什么要做这个&#xff1f; 一个老生常谈且不得不谈问题&#xff1a;随着业务日益发展&#xff0c;如果不做数据迁移&…

【大模型系列】问答理解定位(Qwen-VL/Llama2/GPT)

文章目录 1 Qwen-VL(2023, Alibaba)1.1 网络结构1.2 模型训练 2 Llama2(2023, Meta)2.1 网络结构2.1.1 MHA/GQA/MQA2.1.2 RoPE(Rotary Position Embedding, 旋转式位置编码)2.1.3 RMSNorm 2.2 推理2.2.1 集束搜索(beam search)2.2.2 RoPE外推 3 GPT系列(OpenAI) 1 Qwen-VL(2023…

深度强化学习(六)(改进价值学习)

深度强化学习(六)(改进价值学习) 一.经验回放 把智能体与环境交互的记录(即经验)储存到 一个数组里&#xff0c;事后反复利用这些经验训练智能体。这个数组被称为经验回放数组&#xff08;replay buffer&#xff09;。 具体来说, 把智能体的轨迹划分成 ( s t , a t , r t ,…

软件架构设计 C/S与B/S架构的区别

一、什么是C/S架构&#xff1f; C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机&#xff0c;并采用大型数据库系统&#xff0c;如Oracle或SQLServer。 C/S架构软件有一个特点&#xff0c;就是如果用户要使用的话&#xff0c;需要下载一个客户端&#x…

【Linux系列】计算机系统中的架构与发行版:理解与区分

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

m3u8,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - m3u8。 Github地址&#xff1a;https://github.com/globocom/m3u8 在网络视频传输中&#xff0c;HLS&#xff08;HTTP Live Streaming&#xff09;是一…

unity内存优化之AB包篇(微信小游戏)

1.搭建资源服务器使用(HFS软件(https://www.pianshen.com/article/54621708008/)) using System.Collections; using System.Collections.Generic; using UnityEngine;using System;public class Singleton<T> where T : class, new() {private static readonly Lazy<…

Java项目:58 ssm012医院住院管理系统+vue

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员&#xff1b;首页、个人中心、医护人员管理、科室管理、病人管理、病房管理、病人信息管理、病历管理、医嘱管理、手术安排管理、药品信…

(一)、机器人时间同步方案分析

1、是否有必要进行时间同步 目前的自动驾驶系统包括 感知、定位、决策规划、控制 等模块&#xff0c;这些模块的正常运行需要依靠各种不同类型的传感器数据的准确 融合。尤其是激光雷达与相机这两种传感器在感、知定位模块中起着至关重要的作用。机械式旋转扫描激光雷达本身较低…

(二)移植FreeRTOS到STM32中

一、概念 &#xff08;1&#xff09;任务&#xff08;线程&#xff09;&#xff1a;根据功能的不同&#xff0c;将一个系统分割成一个个独立且无法返回的函数&#xff0c;这个函数就被称为任务 &#xff08;2&#xff09;任务栈&#xff1a;静态创建的任务保存在栈中 &#xf…

LeetCode2. 两数相加(Java)

题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这…

USB打印机改网络打印机

解决传统SMB缺陷可跨平台设备使用。 1、安装deepin 如何安装 – 深度科技社区 2、配置IP地址 vi /etc/network/interfaces && systemctl restart networking 3、安装程序上传到服务器并解压。运行0Dinstalld目录下文件 sh 0Dinstalld/0installdd.sh http://XX.XX.XX…

肝了三天,完成了AIGC工具网站大全,建议收藏再看

说是肝了三天&#xff0c;其实远远不止&#xff0c;前前后后&#xff0c;从资料搜集到最后整理成文&#xff0c;有近一个月了&#xff0c;大家看在整理不易的份上&#xff0c;给点个赞吧&#xff0c;不要光顾着收藏呀&#xff01; 国内网站 AIGC 导航 https://www.aigc.cn 网…
最新文章