Android 使用腾讯mmkv数据持久化技术

OpenHarmony 对存储框架—MMKV 一款小型键值对存储框架支持存储 number、boolean、string、Set类型数据存储支持继承组件中 SerializeBase.ets 的 class 类对象的序列化反序列化支持存储数据备份支持存储数据恢复。 阅读详情

在安卓中可以使用SharedPreferences作为数据持久化的工具,它可以存储键值对形式的数据,本文章将介绍腾讯开源框架MMKV存储的使用,mmkv大体的使用方式与SharedPreferences相似。mmkv存储作为常用的一种组件,可以将mmkv封装成一个TencentMmkvUtil工具类,在结合单例模式,实现数据的快速存储,下面是一整个TencentMmkvUtil工具类的代码,工具类提供各种类型数据的保存和读取方法,还提供删除指定键值的方法和清楚所有数据的方法。

/**
 * TencentMmkvUtil
 * Create on 20220115 by dyj
 */
public class TencentMmkvUtil {
    /**
     * 默认的权重比
     **/
    public static final float DEFAULT_WEIGHT = 0.667f;

    private MMKV mmkv;

    private TencentMmkvUtil() {
        mmkv = MMKV.defaultMMKV();
    }

    public static TencentMmkvUtil newInstance() {
        return SingletonHolder.sInstance;
    }

    //静态内部类
    private static class SingletonHolder {
        private static final TencentMmkvUtil sInstance = new TencentMmkvUtil();
    }

    /**
     * 添加String类型的数据到shared里面保存
     *
     * @param key   键
     * @param value 值
     */
    public void setString(String key, String value) {
        if (!isEmpty(key, value)) {
            if (null == mmkv) {
                mmkv = MMKV.defaultMMKV();
            }
            assert mmkv != null;
            mmkv.encode(key, value);
        }
    }

    /**
     * 获取string类型的数据
     *
     * @param key 键
     * @return 返回值,如果shared里面没有这个值则返回null
     */
    public String getString(String key) {
        if (null == key) {
            return null;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeString(key, "");
    }

    /**
     * 获取string类型的数据
     *
     * @param key 键
     * @return 返回值,如果shared里面没有这个值则返回null
     */
    public String getTimeJiHuaString(String key) {
        if (null == key) {
            return null;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeString(key, "{}");
    }

    /**
     * 获取string类型的数据
     *
     * @param key 键
     * @return 返回值,如果shared里面没有这个值则返回str
     */
    public String getString(String key, String str) {
        if (null == key) {
            return null;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeString(key, str);
    }

    /**
     * 设置boolean值
     *
     * @param key   键
     * @param value 值
     */
    public void setBoolean(String key, boolean value) {
        if (null == key) {
            return;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        mmkv.encode(key, value);
    }

    /**
     * 设置int值
     *
     * @param key   键
     * @param value 值
     */
    public void setInt(String key, int value) {
        if (null == key) {
            return;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        mmkv.encode(key, value);
    }

    /**
     * 设置long值
     *
     * @param key   键
     * @param value 值
     */
    public void setLong(String key, long value) {
        if (null == key) {
            return;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        mmkv.encode(key, value);
    }

    /**
     * 获取boolean值
     *
     * @param key 键
     * @return 默认返回false
     */
    public boolean getBoolean(String key) {
        if (null == key) {
            return false;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeBool(key, false);
    }

    public boolean getBooleanTrue(String key) {
        if (null == key) {
            return false;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeBool(key, true);
    }

    /**
     * 获取int值
     *
     * @param key 键
     * @return 默认返回-1
     */
    public int getInt(String key) {
        if (null == key) {
            return -1;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeInt(key, -1);
    }

    /**
     * 获取int值
     *
     * @param key 键
     * @return 默认返回0
     */
    public int getIntK(String key) {
        if (null == key) {
            return 0;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeInt(key, 0);
    }

    /**
     * 获取long值
     *
     * @param key 键
     * @return 默认返回-1
     */
    public long getLong(String key) {
        if (null == key) {
            return -1;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.decodeLong(key, -1);
    }

    /**
     * 设置float
     *
     * @param key
     * @param value
     * @return
     */
    public boolean setFloat(String key, float value) {
        if (null == key) {
            return false;
        }
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        assert mmkv != null;
        return mmkv.encode(key, value);
    }

    /**
     * 获取float类型
     *
     * @param key
     * @return
     */
    public float getFloat(String key) {
        if (null == key || "".equals(key)) {
            return DEFAULT_WEIGHT;
        }

        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }

        assert mmkv != null;
        if (!mmkv.contains(key)) {
            return DEFAULT_WEIGHT;
        }

        return mmkv.decodeFloat(key, DEFAULT_WEIGHT);
    }

    /**
     * 判断是否为空,如果是空则返回true
     *
     * @param key
     * @param value
     * @return
     */
    private boolean isEmpty(String key, String value) {
        if (null == key || null == value) {
            return true;
        }
        return false;
    }

    /**
     * 清除当前保存在shared的数据
     */
    public void clearAll() {
        if (null == mmkv) {
            mmkv = MMKV.defaultMMKV();
        }
        if (mmkv != null)
            mmkv.clearAll();
        mmkv = null;
    }

    /**
     * 根据key移除掉记录
     *
     * @param key key
     * @return true is remove success,other fail
     */
    public boolean removeKey(String key) {
        if (mmkv.contains(key)) {
            return mmkv.edit().remove(key).commit();
        }
        return false;
    }

    /**
     * 根据key是否存在
     *
     * @param key key
     */
    public boolean containsKey(String key) {
        return mmkv.contains(key);
    }

使用示例:

保存一个String类型的数据:

 TencentMmkvUtil.newInstance().setString("key","value")

读取指定键值的数据:

TencentMmkvUtil.newInstance().getString("key","default")

在进行数据读取时可以设置在get方法中添加多一个参数,这个参数最为读取的默认值,在所读取的数据在内存中为空时,默认将这一默认值作为读取到的数据。

Android MMKV - 性能强悍的存储工具(腾讯出品) MMKV 是腾讯出品的基于mmap内存映射文件技术的一种数据存储的组件,相对于SharedPreferences SQlite 兼容性更好,存读取速度更快.支持常规的各种数据类型. 阅读详情

相关推荐

Android MMKV集成指南

MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据安全性要求高的场景下表现优异。基于mmap内存映射将文件直接映射到内存,省去传统 I/O 的数据拷贝步骤,读写操作直接操作内存,大幅提升性能。通过系统内核确保数据持久化,即使应用崩溃也能保证数据一致性。编码模式使用 Protobuf 进行序列化/反序列化,数据体积更小,解析速度更快,适合移动端资源受限环境。

孤独的狼 1440

Android使用Kotlin封装MMKVUtils

MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。近期也已移植到 Android / macOS / Win32 / POSIX 平台,一并开源。

u012556114的博客 1679

腾讯一面:请你分别谈谈SharedPreferences 和MMKV

SharedPreferences 作为轻量级存储在 Android 应用中是必不可少的,但依旧存在较大的优化空间,小菜在做性能优化时尝试了新的利器 腾讯 MMKV,小菜今天按如下脑图顺序尝试学习和简单分析一下; SharedPreferences 1. SharedPreferences 基本介绍 SharedPreferences 是一种轻量级存储方式,以 key-value 方式存储在本地 xml 文件中;

weixin_43901866的博客 2085

MMKV_MMKV

KVUtils忽喷public final class KVUtils {//MMKV.initialize(this); //初始化mmkv// // 增//mmkv.encode("token", token);//// 删//mmkv.removeValueForKey("token"); //删除单个//mmkv.removeValuesForKeys(new String[]{"...

weixin_39594191的博客 1938

MMKVUtil.kt

MMKV封装类

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6475

Android 安卓告别SharedPreFerences,你好MMKV

文章目录你好 MMKV!为什么要使用 MMKV代码使用引入最简单的代码栗子GitHub 你好 MMKV! MMKV是腾讯开源的轻量级持久化存储框架,相比于传统的SharedPreFerences(以下简称SP),优点有很多 MMKV有更好的锁机制来保证数据的完整,而SP的跨进程和apply机制会导致数据的丢失 SP是全量更新,也正因如此,它的时间开销更大,MMKV存储是mmap,无需全量写入 MMKV同时也能够直接导入SP中的数据 使用MMKV能够更好的避免程序ANR … 为什么要使用 MMKV

两行代码 踏踏实实de工作 4694

最新版 Akamai 逆向 风控破解

经过测试,捷星 jetstar.com,德州仪器 ti.com,w6 wizzair.com,还有一些航空公司的都是可以实现一个并发的有需要的可以。

m0_72605044的博客 6624

腾讯持久化框架MMKV原理探究

一.MMKV实测 二.SharedPreferences有哪些问题 三.MMKV如何解决这些问题的

分享+记录 4802

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

从RadixTree到哈希表:深入对比SGLang和vLLM的Prefix Cache实现差异

本文深入对比了SGLang与vLLM在大语言模型推理服务中实现Prefix Cache(前缀缓存)的两种核心方案。SGLang采用基于Radix Tree的RadixAttention,支持任意长度前缀的精确匹配与灵活复用;vLLM则采用基于哈希表的方案,深度集成于PagedAttention,实现简洁但要求块级精确对齐。文章剖析了二者在设计哲学、内存管理、适用场景及集群级优化(如Prefix Cache Aware Routing)上的关键差异,为高性能LLM服务的技术选型提供决策依据。

blockchain9miner的博客 956

深入剖析:Android MMKV 数据持久化全流程揭秘(6)

MMKV 是基于 mmap 内存映射技术和 Protobuf 数据编码实现的高性能键值对存储框架,它专为 Android 和 iOS 平台量身打造。相较于 Android 传统的,MMKV 在性能、多进程支持等方面都有显著提升。在 Java 层获取应用的文件目录,并创建 MMKV 的存储根目录。调用 JNI 层的方法,将存储根目录路径传递给 C++ 代码。在 C++ 层,保存根目录路径,创建根目录,并初始化读写锁。在 Java 层调用或mmkvWithID方法。

Android开发领域创作者 868

YOLOv13改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU)

本文记录的是改进YOLOv13的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 870

android mmkv使用_Android开发持久化工具MMKV—强大的存储工具

释放双眼,带上耳机,听听看~!前言在Android开发过程中,我们经常会使用到一些存储。如果不是超量级数据的话,我们经常使用sharepreferences存储,关于sharepreferences的封装使用,可以参考我的另一篇文章:SpUtil多样加密存储,兼容android9.0那么,当你的数据量在不需要使用数据库,但sharepreferences感觉又无法承载的时候,是不是超级尴尬?那么今...

weixin_35494876的博客 1312

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

库存管理系统项目部署方案(基于jdk8)

不需要安装到服务器,运维本地安装就行,主要是用来编译前端代码的。构建完成后将dist文件夹复制到服务器内。

程序员诚哥 2576

腾讯开源组件MMKV的使用及原理(1)

https://github.com/Tencent/MMKV/blob/master/readme_cn.md 在需要持久化保存key-value这样的键值对时,通常考虑使用的是SharedPreference,SP最终以xml文件的形式保存数据,并且是直接IO的方式读写数据,在使用中会概率性碰到ANR的问题,不管是使用异步的方法apply,还是阻塞式的commit提交数据,都看会因为IO的瓶...

lin20080410的专栏 3832

huggingface高速下载模型的实战代码

本文主要介绍了huggingface高速下载模型的实战代码,尤其是无法通过国内源进行下载的huggingface模型,希望能对学习大模型的同学们有所帮助。需要特别说明的是,本文的代码是完全原创的,即能够最大限度利用宽度的速度,而且还能实现断点续传。 文章目录 1. 背景 2. 实战代码

herosunly的博客 29万+

android 腾讯MMKV持久化框架使用

最大的特点就是高效,号称要比传统的持久化工具要高效100倍,目标是用来替代原生的SharedPreferences(后续SharedPreferences统称为SP)。本文主要是探究MMKV的实现原理以及为什么比SP高效。MMKV是腾讯18年底推出的一套持久化框架,有安卓,IOS,PC版本等等,微信的持久化功能使用的就是MMKV,项目地址:https://github.com/Tencent/MMKV。在app下面的build.gradle中添加引用。在activity里使用如下。

u013519290的博客 1686

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

安卓性能优化之持久化配置数据-MMKV

本文是在腾讯课堂上跟着Lance老师学习时做的一次笔记,一是为了方便自己以后查看,一是共享给大家。 SharedPrefences(Sp)存在的问题 有一定失败率 会引起系统crash,虽然频率是很低的 MMKV 地址:https://github.com/Tencent/MMKV/blob/master/readme_cn.md 简介:MMKV是基于mmap内存映射的key-value...

qq_23081779的博客 2403

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

腾讯数据持久化方案MMKV原理分析

因此针对这种缺陷,我们往往会换其他的技术方案,例如不能跨进程存取数据,那么就使用SQLite做数据存储,通过Provider对外提供数据,但是这种方案依然存在响应速度慢的问题,很有可能出现ANR,即便是放在了子线程中存取数据,但是依然会存在同步问题,直到MMKV的出现,好像一下就解决了上述的两个问题。那么在文章开篇,我们通过一个小的demo验证一下SharedPreference和MMKV存储数据效率,看具体的效果如何。

1 406

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

记录一下MMKV使用

MMKV是腾讯开源的高性能键值存储框架,相比SharedPreferences具有显著优势:采用mmap内存映射和增量更新技术,读写性能接近内存操作;原生支持多线程安全和跨进程通信;支持更多数据类型。文章通过对比SharedPreferences和ContentProvider,分析了MMKV的核心优势、关键技术实现和适用场景,并提供了使用MMKV+Gson存储SIM卡信息的完整案例,包括单例模式实现、线程安全处理和跨进程支持。MMKV适合高频读写、大数据量存储等场景,但不适合结构化数据存储和复杂查询需求。

JonrayZ的博客 1036

Android MMKV 深度解析:原理、实践与源码剖析

本文深入解析了腾讯开源的高性能键值存储框架MMKV。MMKV基于内存映射(mmap)技术,采用protobuf序列化格式和增量更新机制,相比SharedPreferences具有读写速度快10-100倍、数据安全性高、支持多进程和加密等优势。文章详细介绍了MMKV的核心原理、基础使用方法、高级功能特性以及底层实现机制,包括其动态扩容策略、CRC校验机制和文件锁实现等关键技术点,并提供了从SharedPreferences迁移的实践方案,帮助开发者全面掌握这一高效存储方案。

顾林海 2267

Android 常用开源库 MMKV 源码分析与理解

谈到轻量级的数据持久化,在 Android 开发过程中,大家首先想到的应该就是 SharedPreferences(以下简称 SP),其存储数据是以 key-value 键值对的形式保存在 data/data/\/shared_prefs 路径下的 xml 文件中,使用 I/O 流 进行文件的读写。通常用来保存应用中的一些简单的配置信息,如用户名、密码、自定义参数的设置等。

neuHenry 2359

Android MVVM框架搭建(三)MMKV + Room + RxJava2

Android MVVM框架搭建(三)Room前言正文一、添加依赖二、建库建表 前言   在上一篇文章中,我讲述了怎么在MVVM框架中搭建网络访问框架,并通过一个必应的每日壁纸做了一次请求接口的访问演示,这篇文章就需要来讲述Android端的本地数据库的使用和在MVVM中使用方式了。 正文   本文说的是数据库,为什么要讲这个呢,因为在实际开发中,有一些数据并不需要实时更新,我们只需要在第一次打开应用的时候获取到,然后保存到手机本地数据库中即可,需要的时候从数据库中获取。当数据要更新是再从服务器获取,这样可

晨曦 5950
上一篇: Android 通过构建前台服务实现Service保活
下一篇: Android 通过注解的方式代替findViewById操作
_Amoer
博客等级 码龄6年 30粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值