Android|用SharedPreferences来保持数据的持久性的操作案例

根据Android开发文档,可以将以下类型的值存储在SharedPreferences中:

  1. 基本数据类型

    • boolean
    • float
    • int
    • long
    • String
  2. Set<String> 类型

    • 可以使用Set<String>存储一组唯一的字符串值。

这些类型涵盖了大多数常见的数据存储需求,例如用户偏好设置、应用配置等。然而,需要注意的是:

  • Set<String>类型的存储:只能存储字符串类型的集合,且集合中的字符串元素不能重复。
  • 其它数据类型:如数组、自定义对象等,不能直接存储在SharedPreferences中,需要进行适当的转换(如序列化为String或者使用JSON等方式)后存储。

如果你需要存储的数据是 FloatIntLongBooleanStringSet<String> 类型之一,那么可以直接使用SharedPreferences来进行存储和获取。

持久性: SharedPreferences保存的数据会持久存储在设备的存储器上,通常是存储在一个XML文件中。
生命周期 : 这些数据在应用关闭后仍然存在,并且在应用重新启动时可以重新读取和使用。
删除条件 : 如果你的应用明确调用删除SharedPreferences数据的方法,或者用户通过设备的设置或应用管理器卸载了你的应用,这些数据才会被删除。

因此,SharedPreferences适合存储长期的配置信息、用户偏好设置等数据,而不适合临时性数据或需要频繁变化的数据。

Kotlin 复制代码
/**
getSharedPreferences("Personal", MODE_PRIVATE) 表示获取一个名为"Personal"的SharedPreferences对象。
"Personal" 是这个SharedPreferences文件的名称,你可以根据需要命名。
MODE_PRIVATE 表示这个SharedPreferences文件是私有的,只有创建它的应用程序才能访问。
*/
sp = getSharedPreferences("Personal", MODE_PRIVATE);
//如果获取为空就返回默认值
boolean ck1 = sp.getBoolean("ck_password", false);
boolean ck2 = sp.getBoolean("ck_login", false);

//把用户名和密码保存在SharedPreferences中
sp.edit().putString("name",name).apply(); //注意!!apply才会写入到xml配置文件里面
sp.edit().putString("password",password).apply();
sp.edit().putBoolean("ck_password",true).apply();


//这段代码会删除名为"Personal"的SharedPreferences中名为"key_to_remove"的数据项。
SharedPreferences sharedPreferences = getSharedPreferences("Personal", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove("key_to_remove"); // 替换 "key_to_remove" 为要删除的键
editor.apply();


//这段代码会清除名为"Personal"的SharedPreferences中所有的数据项。
SharedPreferences sharedPreferences = getSharedPreferences("Personal", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear(); // 清除所有数据
editor.apply();


SharedPreferences sp=getSharedPreferences("data",MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit();
editor.putString("name","张三");
editor.putInt("age",8);
editor.commit();//也是提交数据

SharedPreferences.Editor 对象的修改有commit() 和 apply() 。这两个方法的区别在于它们的提交方式和线程安全性:

  1. commit() 方法

    • commit() 方法会同步地将修改写入到持久化存储(磁盘)中,并返回一个布尔值表示修改是否成功。
    • 这个方法会阻塞调用线程,直到写入操作完成,因此在涉及到较大数据量或者频繁操作时,可能会引起性能问题或卡顿。

    示例:

    Kotlin 复制代码
    editor.commit();
  2. apply() 方法

    • apply() 方法是异步的,会将修改放入队列中,并在合适的时机异步写入到持久化存储中。
    • 由于是异步的,它不会阻塞调用线程,因此在性能和用户体验上更好,特别是在数据量较大或频繁操作时。
    • apply() 方法没有返回值,不能判断写入是否成功,通常假设操作是成功的。

    示例:

    Kotlin 复制代码
    editor.apply();

虽然使用了 commit() 方法而不是 apply() 方法,功能上是可以实现将数据写入到SharedPreferences中的。但是,建议在实际应用中考虑使用 apply() 方法,以提高性能和用户体验,特别是在数据量较大或频繁修改的情况下。

相关推荐
未若君雅裁几秒前
LeetCode 51 - N皇后问题 详解笔记
java·数据结构·笔记·算法·leetcode·剪枝
i***68328 分钟前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
液态不合群15 分钟前
DDD驱动低代码开发:从业务流程到领域模型的全链路设计
前端·低代码·架构·ddd
jonyleek19 分钟前
JVS低代码开发中,如何创建自定义前端页面并接入到现有系统中,从创建到接入的全攻略
前端·低代码·前端框架·软件开发
z***751524 分钟前
【SQL技术】不同数据库引擎 SQL 优化方案剖析
数据库·sql
失散1324 分钟前
架构师级别的电商项目——2 电商项目核心需求分析
java·分布式·微服务·架构·需求分析
麦兜*26 分钟前
Redis内存消耗异常飙升?深入排查与Big Key/Hot Key的根治方案
jvm·数据库·spring boot·redis·spring·缓存
谢尔登44 分钟前
【React】React组件的渲染过程分为哪几个阶段?
前端·javascript·react.js
成为你的宁宁1 小时前
【Redis 从入门到实战:详细讲解 Redis 安装配置、RDB/AOF 数据持久化方案、一主两从同步部署,深入剖析哨兵模式工作原理与哨兵模式高可用全攻略】
数据库·redis·缓存
云和数据.ChenGuang1 小时前
r=re.search(r‘data-original=“(.*?)“‘, line)指令解析
数据库·mysql·r语言