Android的轻量级存储SharedPreferences

news2024/11/25 11:01:00

希望文章能给到你启发和灵感~
感谢支持和关注~

阅读指南

  • 序幕
  • SharedPreferences怎么存储
  • SharedPreferences支持的数据类型
  • SharedPreferences操作模式
  • 使用范例
  • 一、基础环境说明
    • 1.1 硬件环境
    • 1.2 软件环境
  • 二、起因
  • 三、解决
    • 3.1 尽量简化数据结构
    • 3.2 文件尽量小
    • 3.3 减少保存的频率
    • 3.4 加载时机和性能考虑
  • 四、总结

序幕

近期写了个android项目,初期设计时,存储这块主要是以sqlite为主导,还使用了SharedPreferences用于存储登录和配置信息;这块我们的目的就是为了数据能在各个页面之间传递和共享;

SharedPreferences怎么存储

1、SharedPreferences以XML文件的形式存储数据,结构类似Java中Map的键值对的存储形式,这些文件通常保存在/data/data/PACKAGE_NAME/shared_prefs/目录下

SharedPreferences支持的数据类型

2、SharedPreferences支持存储Java常规的Long、Int、String等类型的数据

SharedPreferences操作模式

(1)Context.MODE_PRIVATE:这是默认的操作模式,表示该文件是私有数据,只能被应用本身访问。在该模式下,写入的内容会覆盖原文件的内容。

(2)Context.MODE_APPEND:此模式会检查文件是否存在,如果存在就往文件追加内容,否则就创建新文件

(3)Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITEABLE:这两个模式分别表示当前文件可以被其他应用读取和写入。但出于安全性的考虑,这两个模式在Android 4.2版本中已经被弃用。

使用范例

第一步:获取SharedPreferences

SharedPreferences sharedPreferences = getSharedPreferences("MyPreferences", Context.MODE_PRIVATE);

第二步:使用 SharedPreferences.Editor 存储数据

SharedPreferences.Editor editor = sharedPreferences.edit();  
editor.putString("key", "value");  
editor.putInt("key_int", 123);  
editor.apply(); // 或者使用 editor.commit(); 但 apply() 是异步的,通常更快

第三步:查询数据

String value = sharedPreferences.getString("key", "default_value");  
int valueInt = sharedPreferences.getInt("key_int", 0);

🌰:就好比我这里有记住用户的功能,使用sharedPreferences:
在这里插入图片描述

一、基础环境说明

考虑环境因素,大家适当的对比自己的软硬件环境情况分析~

1.1 硬件环境

MacOS Monterey 版本 12.6.8 Apple M1

1.2 软件环境

Android Studio 2021.2.1
Java 1.8.0_171

二、起因

有时候取值,界面出现卡顿现象,博主通常这里是频发,刚启动时就开始;

我们知道,android中页面的控制和跳转逻辑中,很重要的一个组件的就是Activity,开发的初期,其实博主并没有打算使用sqlite数据库,只是一股脑的想把数据存入SharedPreferences,毕竟不是特别大的项目,轻量级的存储就足够了,但是后来在app中各种事件处理过程中,频繁感觉页面时不时会有所卡顿出现;

三、解决

SharedPreferences使用的建议

3.1 尽量简化数据结构

SharedPreferences主要支持一些基础数据类型(如int, float, long, boolean)以及String的存储复杂数据并不太适合他,例如如果你存的是图像的类型,就必须对他进行数据编码转换字符串;这样就会增加了存储的复杂度和轻量级的初衷

3.2 文件尽量小

SharedPreferences创建初始化时,会将整个文件加载到内存中,所以这里如果你的文件很大,就会增加内存消耗,从而影响程序的其他操作的运行,导致程序崩溃或者卡顿问题;

3.3 减少保存的频率

尽量减少对SharedPreferences的编辑(edit)和提交(commit/apply)操作
每次edit都会创建一个新的EditorImpl对象,额外占据内存
commit/apply操作涉及IO操作,多次执行会影响性能

3.4 加载时机和性能考虑

避免在UI线程中执行大量的SharedPreferences操作,因为这可能导致界面卡顿;
提前初始化SharedPreferences,避免在首次创建时因读取文件而导致的等待情况

四、总结

SharedPreferences其实在某种形式上有点类似我们的redis,虽然没有那么强大,但是对于简单的配置信息保存是足够的,毕竟他的定位就是简单和轻量级;

保存SharedPreferences时apply() 和 commit() 方法的区别在于:apply() 是异步的,而 commit() 是同步的。因此,apply() 通常更快,但在某些情况下,你可能需要 commit() 的同步行为。

SharedPreferences 不适合存储大量数据或复杂的数据结构。对于这种情况,我们应该考虑使用 SQLite 数据库或其他存储解决方案。

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

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

相关文章

高考之后,专业与学校如何选择?

随着2024年高考的结束,考生们面临着选择专业或学校的难题。选择专业意味着专注于一个特定领域,直接影响未来的职业发展和兴趣培养;而选择学校则提供了更优越的学术氛围和广泛的社交机会,对个人综合素质提升有重要作用。无论选择哪…

【Springboot系列】总结websocket的几种实现方式,建议收藏

1、前言 websocket在java中有多种实现方式,一直没有做一个整理,今天整理下三种最常用的实现方式以及一些注意点 2、javax 实现方式 之前已经单独记录了这种方式 【SpringBoot系列】springboot websocket全套模板,省去搭建的烦恼&#xff…

直播无线麦克风哪个好?一文揭秘无线领夹麦克风哪个牌子好!

​在人人可做自媒体的时代,众多普通人加入自媒体。对拍视频的自媒体人,好内容是基础,好设备是保障。想提升视频音质需专业无线麦克风。现无线麦克风品牌多,如何少花钱买高性价比产品是问题。作为资深自媒体人,我用过的…

QT实现多摄像头监控

工具使用方法: 1、在add camera后面输入对应摄像头的IP后,点击add会自动布局显示。 2、在del camera后选择一个对应IP后,点击del会自动删除对应摄像头的显示,且整体布局会自动调整。 工具使用场景: 测试摄像头的好坏。…

Rust 开发搜索引擎 Quickwit 替代ES,成本降低 10 倍,查询亚秒级别!

一、Quickwit 概述 Quickwit 它是云存储上最快的搜索引擎,它非常适合用于可观察性的云原生搜索引擎,如日志、跟踪以及即将推出的指标。同时也是 Datadog、Elasticsearch、Loki 和 Tempo 的开源替代方案。 二、Quickwit 功能 全文搜索和聚合查询&#…

视觉应用线扫相机速度反馈(伺服转盘)

运动控制实时总线相关内容请参考运动控制专栏,这里不再赘述 1、运动控制常用单位u/s运动控制单位[u/s]介绍_运动控制 unit是什么单位-CSDN博客文章浏览阅读176次。运动控制很多手册上会写这样的单位,这里的u是英文单词unit的缩写,也就是单位…

哈喽GPT-4o——对GPT-4o 提示词的思考与看法

目录 一、提示词二、常用的提示词案例1、写作助理2、改写为小红书风格3、英语翻译和改写4、论文式回答5、主题解构6、提问助手7、Nature风格润色8、结构总结9、编程助手10、充当终端/解释器 大家好,我是哪吒。 最近,ChatGPT在网络上广受欢迎&#xff0c…

持PMP证书可以免考申请CSPM-2国标证书!

一提到项目管理的专业认证,大家首先想到的肯定是以PMP为核心的PMI体系认证。当然也有BSI和IPMP等其他体系认证,但都是从国外引进的专业认证,我国始终缺少符合中国特色项目管理环境下的项目管理专业认证体系。 如今,更符合中国国情…

Python中关于电商商品数据的采集【taobao/JD/商品详情数据返回】

在Python中采集电商商品数据(如淘宝、京东等)通常涉及到网络爬虫(web scraping)或称为网络数据抓取(web data scraping)。由于电商平台通常会有反爬虫机制,因此直接抓取数据可能会遇到各种挑战&…

【Kubernetes】k8s--安全机制

机制说明 Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介, 也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。 比如 kubectl 如果想向 …

[JavaScript]何为变量提升?

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/139742129 出自【进步*于辰的博客】 关于编译与解释,详述可查阅博文《[Java]知识点》…

SQL:按用户名复制权限

生产系统中有一个模块是管理用户及菜单权限,它们是由3个数据表组成,关系及字段如下: 原来为每个用户添加菜单的访问权限时都是一个一个添加,但今天遇到有个新来的员工,需要具有与另一个员工相同的权限。新建一个用户后…

SQL Server 中处理重复数据:保留最新记录的两种方案

目录 首先准备测试的数据表 方案一. 使用ROW_NUMBER()函数删除重复项 方案二. 使用临时表的方式 大家在项目开发过程中,数据库几乎是每一个后端开发者必备的技能,并且经常会遇到对于数据表重复数据的处理,一般需要去除重复保留最新的记录。今天这里给大家分享两种种方案,…

【Git】-- 添加公钥到 github 或者gitlab上

仅针对系统:mac os 、 unix、linux 1、检查是否有 id_rsa.pub $ cd ~ $ ls -al ~/.ssh 注意:若已有 id_rsa.pub,则必要执行 第二步,避免覆盖掉原有正常的公钥。 配置多个 git 账号请参考:同一台电脑配置多个git账…

Python工具箱系列(五十三)

​​水印 水印是一种常见的图片处理需求。当既需要展示,又需要保护知识产权时,就需要使用文字或者图片来打水印。下面的代码展示了文字水印与图片水印的过程。 ​--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown from pat…

电源小白入门学习11——反激电源电路原理

电源小白入门学习11——反激电源、正激电源 隔离电源变压器介绍反激电源 前面我们学习了BUCK、BOOST、BUCK-BOOST 等各种各样的DCDC变换器,但是他们都有一共同的特点,即能量的传输路径时一个完整的通路,输入与输出之间不存在电气隔离&#xf…

C++链表相关内容温习回顾——移除链表元素

本文主要对之前学过的C链表相关内容进行温习回顾,并以 移除链表元素 为例,进行应用。 关于链表的基础理论可见:链表理论基础 应用示例:LeetCode 203 移除链表元素 https://leetcode.cn/problems/remove-linked-list-elements/ 0、…

Redis作者长文总结LLMs, 能够取代99%的程序员

引言 这篇文章并不是对大型语言模型(LLMs)的全面回顾。很明显,2023年对人工智能而言是特别的一年,但再次强调这一点似乎毫无意义。相反,这篇文章旨在作为一个程序员个人的见证。自从ChatGPT问世,以及后来使…

定个小目标之刷LeetCode热题(22)

这道题最容易想的就是排序后再遍历,但是时间复杂度就不是O(n)了,所以还是得用更优的解法,直接看题解,它是使用了HashSet,遍历数组,对于每一个数x,如果不存在x - 1则进入内循环,否则跳…

springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028

摘 要 在面对当今培育人才计划的压力,人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面,因此他们对学习的欲望不断扩大,图书馆作为我们的学习宝地,有着不可替代的地位。但是在信息化时代,传统模式下的图书馆…