Android初级教程 - 四大存储之SP存储

2023-10-30

 

1.SharedPreFerences是什么

是安卓的一种最轻量的储存类,储存为xml文件储存到/data/data/包名/shared_prefs下,一般用来存储一些比较简单的数据,比如用户名姓名,密码等等

2.如何储存数据

SharedPreFerences 储存数据分为四步 
1.新建sharedPreFerences对象 
2.通过sharedPreFerences.editor()创建editor对象 
3.储存数据,通过editor.putString()、editor.putInt()方法储存,括号内是以键值对的形式存在例如editor.putString(“name”,”小明”) 
4.提交数据 editor.commit(); 

//sp为新建xml文件的文件名,MODE模式,PRIVATE私有
 SharedPreferences sharedPreferences=getSharedPreferences("sp",MODE_PRIVATE);
        SharedPreferences.Editor editor=sharedPreferences.edit();
        editor.putString("name","张三");
        editor.commit();

3.如何读取数据

editor提交了数据后,如果我们要访问数据,就可以通过sharedPreferences对象读取,editor
是put,sharedPreferences就是get,后面还要加上一个默认值

 SharedPreferences sharedPreferences=getSharedPreferences("sp",MODE_PRIVATE);
        SharedPreferences.Editor editor=sharedPreferences.edit();
        editor.putString("name","张三");
        editor.commit();
        sp_tv.setText(sharedPreferences.getString("name",""));

 


SP存储的信息是否会因为app的卸载而清空呢?
其实用 SharedPreferences  保存的数据,卸载 App 后还存在 ~
搜寻之后发现从Android 6.0开始,它可以使用allowBackup属性的boolean来进行设置:

true:数据将保存在Google云中,并在下次安装该应用程序时进行恢复
       false:数据将会在卸载app的时候同时做清空处理

<application
        android:allowBackup="true">
</application>

下面是sp存储的封装类

public class SPUtils {
    public SPUtils() {
        /* cannot be instantiated */
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    /**
     * 保存在手机里面的文件名
     */
    public static final String FILE_NAME = "app_data";

    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     *
     * @param context
     * @param key
     * @param object
     */
    public static void put(Context context, String key, Object object) {

        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();

        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }

        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     *
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);

        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }

        return null;
    }

    /**
     * 移除某个key值已经对应的值
     *
     * @param context
     * @param 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);
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 清除所有数据
     *
     * @param context
     */
    public static void clear(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 查询某个key是否已经存在
     *
     * @param context
     * @param key
     * @return
     */
    public static boolean contains(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        return sp.contains(key);
    }

    /**
     * 返回所有的键值对
     *
     * @param context
     * @return
     */
    public static Map<String, ?> getAll(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        return sp.getAll();
    }

    /**
     * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
     *
     * @author zhy
     */
    private static class SharedPreferencesCompat {
        private static final Method sApplyMethod = findApplyMethod();

        /**
         * 反射查找apply的方法
         *
         * @return
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private static Method findApplyMethod() {
            try {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e) {
            }

            return null;
        }

        /**
         * 如果找到则使用apply执行,否则使用commit
         *
         * @param editor
         */
        public static void apply(SharedPreferences.Editor editor) {
            try {
                if (sApplyMethod != null) {
                    sApplyMethod.invoke(editor);
                    return;
                }
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
            editor.commit();
        }
    }

}

使用方式:

String dateString = SpUtils.get(context, "date", "").toString();
SpUtils.put(context, "date", dateNowString);


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android初级教程 - 四大存储之SP存储 的相关文章

  • 有关 paddingStart 使用的冲突 lint 消息

    API 17 RTL 支持发布后 我将以下内容添加到我的清单中 android supportsRtl true 这导致 Lint 在我的视图中有 paddingLeft Right 的地方正确地向我发出这些警告 考虑添加 android
  • RecyclerView 未显示列表中的所有项目

    我在用RecyclerView在我的应用程序中 每次我打开屏幕时 我只能看到一项 但当我调试时 它每次都会出现onBindViewHolder method 这是我的适配器 Override public ViewHolder onCrea
  • Android STFP 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的 Android 项目中使用 SFTP 安卓已经有了吗 SFTP 库 还是我必须实现它 I
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • Android Studio:Android 设备监视器未显示我的设备

    我的真实设备是索尼 Xperia c6502安卓版本4 3 我确定我将其连接到我的计算机然后打开开发者选项 USB调试 on 在 SDK 管理器中 Google USB 驱动程序已安装 I downloaded Xperia Z Drive
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • Android 中带有透明背景的 ImageButton [重复]

    这个问题在这里已经有答案了 我已经按照这篇文章在android中制作ImageButton 安卓图像按钮 https stackoverflow com questions 2283444 android image button 图像出现
  • 使用 DiffUtil 在 RecyclerView 上添加拖放

    我有一个从房间数据库更新的列表 我从 Room 收到更新的数据作为新列表 然后将其传递给列表适配器 https developer android com reference androidx recyclerview widget Lis
  • 如何在 Android 应用程序中使用多个 Graph API 获取 Facebook Notes 项目的评论?

    我想使用 Graph API 显示 Facebook 页面的注释项目以及这些评论和点赞 为此 我使用 Facebook SDK 中的 asyncFacebookRunner 步骤是这样的 调用 asyncFacebookRunner req
  • Proguard - 找不到任何超级类

    我收到此错误 Unexpected error while performing partial evaluation Class org apache log4j chainsaw Main Method
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 使用 cordova cli 构建时的 Android 安装位置

    我正在使用 cordova CLI 工具构建一个大型 cordova phonegap 应用程序 我需要 AndroidManifest xml 文件中的 installLocation 具有 installLocation auto 或p
  • 确定视图是否在屏幕上 - Android

    我对这个有点困惑 首先也是最重要的是 以下链接很有用 但是我提出了一些可见性问题 链接 检查视图可见性 https stackoverflow com questions 4628800 android how to check if a
  • 在 Android ADT Eclipse 插件中滚动布局编辑器

    有谁知道当布局编辑器的内容溢出一个 屏幕 时如何滚动这些内容 我说的是在设计时使用 ADT 布局编辑器 而不是在物理设备上运行时滚动 效果很好 关闭 Android 布局编辑器中的剪辑 切换剪辑 按钮位于 Android 布局编辑器的右上角
  • 如何在 Android 中保存 Edittext 中的文本而不丢失文本的粗体、斜体等功能

    我想做的就是从 Edittext 中获取文本 该文本具有粗体和斜体等功能 并将其保存在文本文件中 但是当我读回并显示它时 这些功能丢失了 它们不显示 如何通过将文本保存在文本文件或任何文件中来保持丰富的功能 您可以使用Html toHtml
  • 获取当前图片在图库中显示的位置

    在我的应用程序中 我有一个图片库 但我想检测当前显示图像的位置 例如 当我启动我的活动时 位置是 0 但是当我在图库中滚动时 我想获取当前显示图像的位置 我尝试过 OnFocusChanged OnItemClicked 但只有当我单击图库
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • compileReleaseKotlin 失败并出现 java.lang.ClassNotFoundException:com.sun.tools.javac.util.Context

    我正在尝试使用 gradlew 通过终端构建我的 Android 项目 其中包含库模块 在 Android Studio 中 它编译并安装成功 但是当我尝试运行时 gradlew assembleDebug我得到以下堆栈跟踪 Using k
  • firebase中按范围查询

    我有一个食品价格范围滑块 根据滑块的最小值和最大值 我想显示此范围内的食品 滑块代码 multiSlider setOnThumbValueChangeListener new MultiSlider SimpleChangeListene

随机推荐

  • 将n个数按从大到小输出(C语言)

    用数组存储需要排序的数 用for循环输入需要排序的数 用冒泡排序法对n个数进行排序 最后用for循环输出排好的数 输入需要排序的数 for i 0 i lt n i scanf d a i 冒泡排序法进行排序 for int j 0 j l
  • 基于改进的混沌引力常数的引力搜索算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 本文将十张混沌图嵌入到最近提出的基于人口的
  • 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    有时候 很简单的模板题 可能有人没有做出来 特指 I 到时候一定要把所有的题目全部看一遍 文章目录 B 题解 E F 题解 H I 题解 代码 J B 输入样例 3 2 1 2 1 2 3 1 输出样例 1 说明 In the first
  • qt问题之no known conversion from ... to “const QObject *“ ...

    函数体 connect socket SIGNAL readyRead this SLOT hasPendingMessage 解决办法 connect socket SIGNAL readyRead const QObject this
  • SAT&SMT

    前言 本文性质 个人学习笔记 SAT SATISFIABILITY 布尔可满足性问题 SMT Satisfiability Modulo Theories 可满足性模理论 根据哥德尔不完备定理 停机问题 莱斯定理 我们可以知道在有限时间内是
  • 基于Python的手机数据收集软件-爬虫可视化大屏Python爬虫安装数据分析与可视化计算机毕业设计

    更多项目资源 最下方联系我们 目录 一 项目技术介绍 二 项目配套文档 部分内容 资料获取 一 项目技术介绍 该项目含有源码 文档 PPT 配套开发软件 软件安装教程 项目发布教程 包运行成功以及课程答疑与微信售后交流群 送查重系统不限次数
  • Identity and Access Management - python decorators (代码)

    from functools import wraps def add greeting f wraps f def wrapper args kwargs print Hello return f args kwargs return w
  • nginx源码分析--状态机执行

    11个阶段处理HTTP请求 void ngx http core run phases ngx http request t r ngx int t rc ngx http phase handler t ph ngx http core
  • Markdown格式文档图片设置居中

    1 使用div设置对齐方式 div align center img src 图片路径 div 此处的center可以更换 left 左对齐 right 右对齐 center 居中 下图示例 div align center img src
  • 《算法》第二章——快排非递归实现

    思路 其实就是用栈保存每一个待排序子串的首尾元素下标 下一次while循环时取出这个范围 对这段子序列进行partition操作 代码 include
  • 如何保证代码质量

    代码质量的评估维度很多 我自己的理解有这几个层次 能用 gt 能读 gt 能改 gt 能适应业务的变更 高质量的代码不是一蹰而就的的 是从特别小的细节例如变量命名规则到高大上的架构设计 一点点积累而成的 关于架构设计的部分 正在阅读 重构
  • 13、不同存储引擎的数据表在文件系统里是如何表示的?

    MySQL 支持 InnoDB MyISAM Memory Merge Archive CSV BLACKHOLE 几种存储引擎 不同存储引擎的数据表在文件系统中的表示也各不相同 MySQL 中的每一个数据表在磁盘上至少被表示为一个文件 即
  • 融云出海:社交泛娱乐出海,「从 0 到 1」最全攻略

    9 月 21 日 融云直播课社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用 欢迎点击上方小程序报名 本期我们翻到 地图 的实践篇 从赛道 品类选择 目标地区适配 用户增长 变现模式 本地化运营 跨国团队管理等方面完整描绘
  • 用matlab使用灰狼算法规划15个城市的最短路径

    在Matlab中使用灰狼算法规划15个城市的最短路径需要以下步骤 建立矩阵 首先 您需要建立一个矩阵来存储15个城市之间的距离 定义灰狼算法参数 然后 您需要定义灰狼算法的各种参数 例如种群数量 迭代次数 学习因子等 运行灰狼算法 接下来
  • "当B发生时,是A发生的概率降低了,可以由此推出,当B不发生时A发生的可能性增大了"的直观解释

    一 当B发生时 是A发生的概率降低了 可以由此推出 当B不发生时A发生的可能性增大了 数学上的推导是容易的 即 二 接下来找一种直观上的解释 设有一个矩形的面积为1 设其为事件 发生的概率 A发生的概率即为A的面积 A B同时发生的概率即为
  • 【数据结构】线性表的链式存储结构简单实现及应用

    链表是指用一组任意的存储单元来依次存放线性表的结点 这组存储单元即可以是连续的 也可以是不连续的 甚至是零散分布在内存中的任意位置上的 因此 链表中结点的逻辑次序和物理次序不一定相同 为了能正确表示结点间的逻辑关系 在存储每个结点值的同时
  • android 启动过程分析

    Servicemanager需要先启动 zygote后面的service需要用到servicemanager的服务
  • 使用R语言生成新的数据列

    使用R语言生成新的数据列 在R语言中 我们可以使用各种方法来生成新的数据列 这些方法可以帮助我们处理和分析数据 为我们提供更多的洞察力 本文将介绍几种在R语言中生成新数据列的常用方法 并提供相应的源代码示例 使用算术运算符生成新列 我们可以
  • 小程序整改获取用户隐私

    整改要求如下 请开发者自查并去除频繁跳出来的手机号登录界面 手机号授权弹窗 去除小程序内非必要页面的手机号登录界面 手机号授权弹窗 正常的内容浏览是不支持获取用户手机号或其他隐私信息 在必要场景下才告知用户需授权手机号 且页面需要有 用户协
  • Android初级教程 - 四大存储之SP存储

    1 SharedPreFerences是什么 是安卓的一种最轻量的储存类 储存为xml文件储存到 data data 包名 shared prefs下 一般用来存储一些比较简单的数据 比如用户名姓名 密码等等 2 如何储存数据 Shared