android MMKV数据持久化缓存集合

前言

最近在使用mmkv缓存的时候 发现没有集合缓存
非常不方便 自己写一个方法

MMKV

public class MmkvUtils {private MmkvUtils() {throw new UnsupportedOperationException("u can't instantiate me...");}public static void init() {MMKV.initialize(LeoUtils.getApplication());}/*默认表名put值*/public static void put(String key, Object object) {MMKV mmkv = MMKV.defaultMMKV();if (object instanceof String) {mmkv.encode(key, (String) object);} else if (object instanceof Integer) {mmkv.encode(key, (Integer) object);} else if (object instanceof Boolean) {mmkv.encode(key, (Boolean) object);} else if (object instanceof Float) {mmkv.encode(key, (Float) object);} else if (object instanceof Long) {mmkv.encode(key, (Long) object);} else {mmkv.encode(key, object.toString());}}/*默认表名获取值*/public static Object get(String key, Object defaultObject) {MMKV mmkv = MMKV.defaultMMKV();if (defaultObject instanceof String) {return mmkv.decodeString(key, (String) defaultObject);} else if (defaultObject instanceof Integer) {return mmkv.decodeInt(key, (Integer) defaultObject);} else if (defaultObject instanceof Boolean) {return mmkv.decodeBool(key, (Boolean) defaultObject);} else if (defaultObject instanceof Float) {return mmkv.decodeFloat(key, (Float) defaultObject);} else if (defaultObject instanceof Long) {return mmkv.decodeLong(key, (Long) defaultObject);}return null;}/*默认表名移除值*/public static void remove(String key) {MMKV mmkv = MMKV.defaultMMKV();mmkv.removeValueForKey(key);}/*默认表名判断当前值是否存在*/public static boolean contains(String key) {MMKV mmkv = MMKV.defaultMMKV();return mmkv.contains(key);}/*默认表明用来保存类*/public static <T extends Serializable> boolean putByClass(String key, T entity) {if (entity == null) {return false;}MMKV mmkv = MMKV.defaultMMKV();String json = GsonUtil.ser(entity);return mmkv.encode(key, json);}/*默认表明用来保存类1、移除和查询同普通数据类型*/public static <T extends Serializable> T getByClass(String key, Class<T> clazz) {MMKV mmkv = MMKV.defaultMMKV();String json = mmkv.decodeString(key,null);if (json == null) {return null;}return GsonUtil.deser(json, clazz);}/*如果不想用默认表明,也可以用如下方式,自定义个MMKV kv = MMKV.mmkvWithID("MyID");*//**用途:增改sp的数组  name-自定义集合的名称*/public static <T> Boolean putArray( List<T> list, String name) {MMKV kv = MMKV.defaultMMKV();if (list == null || list.size() == 0) { //清空kv.putInt(name + "size", 0);int size = kv.getInt(name + "size", 0);for (int i = 0; i < size; i++) {if (kv.getString(name + i, null) != null) {kv.remove(name + i);}}} else {kv.putInt(name + "size", list.size());if (list.size() > 20) {list.remove(0);   //只保留后20条记录}for (int i = 0; i < list.size(); i++) {kv.remove(name + i);kv.remove(new Gson().toJson(list.get(i)));//删除重复数据 先删后加kv.putString(name + i, new Gson().toJson(list.get(i)));}}return kv.commit();}/**用途:加载sp的数组 name-自定义集合的名称*/public static <T> ArrayList<T> getArray( String name, T bean) {MMKV kv = MMKV.defaultMMKV();ArrayList<T> list = new ArrayList<T>();int size = kv.getInt(name + "size", 0);for (int i = 0; i < size; i++) {if (kv.getString(name + i, null) != null) {try {list.add((T) new Gson().fromJson(kv.getString(name + i, null), bean.getClass()));} catch (Exception e) {e.printStackTrace();}}}return list;}}

使用方法

业务场景 用户读取了谋篇文章 加入缓存
打开历史浏览 可以看到之前的item

 MmkvUtils.putArray(cache, "history");ArrayList<HomeBean> history = MmkvUtils.getArray("history", new HomeBean());

实现缓存效果

1

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

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

相关文章

脚本.py文件转.exe文件遇见的问题,打开exe文件出现弹窗: No module named ‘xxx‘

目录 1 问题2 问题分析3 解决过程3.1 确保Pillow库存在3.2 迷惑阶段3.3 解决问题 4 希望大佬解答 1 问题 今天做了一个使用Python写的脚本文件.py&#xff0c;打算把它转换成.exe文件。点击生成的exe文件时&#xff0c;出现了如下弹窗。 2 问题分析 根据错误描述&#xff1…

国际黄金在哪里买?

国际黄金可以在以下几个主要的市场和渠道进行购买&#xff1a; 1. 黄金交易所&#xff1a;国际上有多个黄金交易所&#xff0c;其中最知名的是伦敦金属交易所&#xff08;London Bullion Market Association&#xff0c;简称LBMA&#xff09;。LBMA是全球最大的黄金交易市场&am…

Arrays --Java学习笔记

Arrays 用来操作数组的一个工具类 Arrays类提供的常见方法&#xff1a; 代码演示&#xff1a; import java.util.Arrays; import java.util.function.IntToDoubleFunction; import java.util.function.IntUnaryOperator;public class Arrays类 {public static void main(Str…

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…

OpenCASCADE开发指南<七>:OCC 中的数学基本类型和数学算法

1 标准对象的集合容器 在处理现实问题时&#xff0c;经常将问题抽象成一个数学模型&#xff0c;接着对模型求解&#xff0c; 然后将解提取出来以解决现实问题。 其实在 CAD 软件中&#xff0c; 主要解决的就是数学模型。因此&#xff0c;本节将描述 OCC 的数学基本类型和数学算…

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…

【LeetCode每日一题】2789. 合并后数组中的最大元素

文章目录 [2789. 合并后数组中的最大元素](https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/)思虑&#xff1a;代码&#xff1a; 2789. 合并后数组中的最大元素 思虑&#xff1a; 1.因为要合并的条件之一是&#xff0c;num[i]<num[i1].所…

5.Python从入门到精通—Python 运算符

5.Python从入门到精通—Python 运算符 Python 运算符算术运算符比较&#xff08;关系&#xff09;运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级 Python 运算符 Python语言支持以下类型的运算符: 算术运算符比较&#xff08;关系&#xff09;运算符赋…

c++11语法特性

c11 1.c11发展简介 ​ 第一个比较正式的c标准是1998提出的c98标准。之后定了5年计划&#xff0c;每5年来一次大更新。在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C…

RabbitMQ 模拟实现【三】:存储设计

文章目录 数据库设计SQLite配置数据库实现 数据库关于哈希表等复杂类的存储启动数据库 文件设计消息持久化消息属性格式核心方法消息序列化消息文件回收 统一硬盘存储管理内存存储管理线程安全数据结构实现 数据库设计 数据库主要存储交换机、队列、绑定 SQLite 此处考虑的是…

完整的通过git命令框和windows窗口将本地文件上传到gitee远程仓库流程步骤

1.下载git 这个网站搜索git官方&#xff0c;去下载就行了 2.打开git安装后的Git Bash命令框 3.在Git Bash命令框设置一下要远程链接的gitee账号 git config --global user.name “名字”Git config --global user.email “邮箱” 4.查看一下账号设置 git config --global -…

Chitosan-PEG-DSPE 壳聚糖修聚乙二醇磷脂 DSPE-PEG-Chitosan

产品简称&#xff1a;DSPE-PEG-Chitosan、Chitosan-PEG-DSPE、DSPE-PEG-CS、CS-PEG-DSPE 产品中文名称&#xff1a;壳聚糖-聚乙二醇-磷脂、磷脂-聚乙二醇-壳聚糖 分子量&#xff1a;可以根据要求定制 保存条件&#xff1a; -20干燥保存 有效期&#xff1a; 一年 纯度&…

创建SpringCloudGateWay

创建SpringCloudGateWay 本案例基于尚硅谷《谷粒商城》项目&#xff0c;视频27 创建测试API网关 1、创建module 2、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:x…

C++进阶--mep和set的模拟实现

红黑树链接入口 底层容器 模拟实现set和map时常用的底层容器是红黑树。 红黑树是一种自平衡的搜索二叉树&#xff0c;通过对节点进行颜色标记来保持平衡。 在模拟实现set和map时&#xff0c;可以使用红黑树来按照元素的大小自动排序&#xff0c;并且保持插入和删除操作的高效…

Set cancelled by MemoryScratchSinkOperator

Bug信息 Caused by: com.starrocks.connector.spark.exception.StarrocksInternalException: StarRocks server StarRocks BE{host=10.9.14.39, port=9060} internal failed, status code [CANCELLED] error message is [Set cancelled by MemoryScratchSinkOperator]Bug产生的…

微信名【无感】的同学,你还好吗?

今天遇到个选择了微信一对一服务的同学&#xff0c;问Python问题&#xff0c;问题比较简单。 回答完问题&#xff0c;我就说了一句&#xff1a;问题比较简单&#xff0c;随意打赏一个红包就行了。 然后我就被拉黑了&#xff0c;然后我的解答问题&#xff0c;收到了一堆投诉&…

深入解析Java中锁机制以及底层原理

一、概述 1.1 背景 概念&#xff1a;锁是多线程编程中的机制&#xff0c;用于控制对共享资源的访问。可以防止多个线程同时修改或读取共享资源&#xff0c;从而保证线程安全。 作用&#xff1a;锁用于实现线程间的互斥和协调&#xff0c;确保在多线程环境下对共享资源的访问顺…

Flutter开发入门——Widget和常用组件

1.什么是Widget&#xff1f; 在Flutter中几乎所有的对象都是一个 widget 。与原生开发中“控件”不同的是&#xff0c;Flutter 中的 widget 的概念更广泛&#xff0c;它不仅可以表示UI元素&#xff0c;也可以表示一些功能性的组件如&#xff1a;用于手势检测的 GestureDetecto…

spring中事务失效的场景有哪些?

异常捕获处理 在方法中已经将异常捕获处理掉并没有抛出。 事务只有捕捉到了抛出的异常才可以进行处理&#xff0c;如果有异常业务中直接捕获处理掉没有抛出&#xff0c;事务是无法感知到的。 解决&#xff1a;在catch块throw抛出异常。 抛出检查异常 spring默认只会回滚非检…