安卓:MMKV——键值存储库

目录

一、MMKV介绍

1.特点和优势:

2.使用指南:

3.依赖包:

二、MMKV的常用方法

1、初始化和获取实例:

2、存储数据:

3、读取数据

4、删除数据

5、其他操作:

三、MMKV的使用例子

MainActivity:

activity_main:

运行结果:

四、MMKV与SharedPreferences比较

一、MMKV介绍

MMKV是一种用于安卓平台的轻量级键值存储库,它提供了一种高效、可靠的方式来在应用程序中存储和读取数据。

1.特点和优势:

  • 高性能:相对于传统的SharedPreferences和SQLite等存储方式,MMKV在性能方面表现出色。
  • 轻量级:MMKV是一个小巧的库,没有外部依赖,易于集成到现有项目中。
  • 多线程支持:MMKV具备良好的多线程支持,可以在并发场景下安全地进行数据读写操作。
  • 易用性:MMKV提供简单易用的API,支持各种数据类型的存储和读取操作。
  • 数据安全:MMKV采用内置的AES加密机制,保护存储的数据安全。

2.使用指南:

  1. 引入依赖:在项目的build.gradle文件中添加MMKV的依赖项。
  2. 初始化MMKV:在应用程序的入口处初始化MMKV实例,可以设置存储路径、加密密钥等参数。
  3. 存储数据:使用putXXX()方法将数据存储到MMKV中,支持各种数据类型。
  4. 读取数据:使用getXXX()方法从MMKV中读取数据,并进行相应的类型转换。
  5. 其他操作:MMKV还提供了删除特定键值、清空所有数据等操作。

3.依赖包:

java 复制代码
​dependencies {
   implementation 'com.tencent:mmkv:1.2.10'

}

二、MMKV的常用方法

1、初始化和获取实例:

java 复制代码
String rootDir = MMKV.initialize(context); // 初始化默认根目录
MMKV mmkv = MMKV.defaultMMKV(); // 获取默认的MMKV实例

2、存储数据:

java 复制代码
mmkv.encode("key", value); // 存储数据,自动根据类型选择合适的方法
// 或者使用特定类型的存储方法
mmkv.putInt("intKey", intValue);
mmkv.putLong("longKey", longValue);
mmkv.putFloat("floatKey", floatValue);
mmkv.putBoolean("booleanKey", booleanValue);
mmkv.putString("stringKey", stringValue);
mmkv.putStringSet("setKey", stringSet);

3、读取数据

java 复制代码
Object value = mmkv.decode("key"); // 读取数据,自动根据类型选择合适的方法
// 或者使用特定类型的读取方法
int intValue = mmkv.getInt("intKey", defaultValue);
long longValue = mmkv.getLong("longKey", defaultValue);
float floatValue = mmkv.getFloat("floatKey", defaultValue);
boolean booleanValue = mmkv.getBoolean("booleanKey", defaultValue);
String stringValue = mmkv.getString("stringKey", defaultValue);
Set<String> stringSet = mmkv.getStringSet("setKey", defaultSet);

4、删除数据

java 复制代码
mmkv.remove("key"); // 删除指定键值对
mmkv.removeValueForKey("key"); // 同上,作用相同
mmkv.removeValuesForKeys(new String[]{"key1", "key2"}); // 删除多个键值对
mmkv.clearAll(); // 清空所有数据

5、其他操作:

java 复制代码
boolean contains = mmkv.containsKey("key"); // 判断是否包含指定的键
int count = mmkv.count(); // 获取存储的数据总数
String[] allKeys = mmkv.allKeys(); // 获取所有存储的键

三、MMKV的使用例子

MainActivity:

java 复制代码
package com.example.mmkvdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Toast;

import com.tencent.mmkv.MMKV;


public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
    EditText password, account;
    Button login, register;
    CheckBox mCheckBox;
    String Password, Account;
    MMKV mmkv;
    String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        // 初始化MMKV
        String rootDir = MMKV.initialize(this);
        Log.d(TAG, "路径:" + rootDir);

        // 读取保存的账号和密码
        mmkv = MMKV.defaultMMKV();
        if (mmkv.contains("account") && mmkv.contains("password")) {
            Account = mmkv.decodeString("account", "");
            Password = mmkv.decodeString("password", "");
            account.setText(Account);
            password.setText(Password);
        }
    }

    private void initView() {
        mCheckBox = findViewById(R.id.Login_Remember);
        login = findViewById(R.id.login_btn_login);
        register = findViewById(R.id.login_btn_register);
        password = findViewById(R.id.login_edit_pwd);
        account = findViewById(R.id.login_edit_account);
        mCheckBox.setOnCheckedChangeListener(this);
        register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "点击了注册", Toast.LENGTH_LONG).show();
            }
        });
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "点击了登录", Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            if (!TextUtils.isEmpty(password.getText().toString()) && !TextUtils.isEmpty(account.getText().toString())) {
                // 存储数据
                Account = account.getText().toString();
                Password = password.getText().toString();
                mmkv.putString("account", Account); // 存储数据
                mmkv.putString("password", Password);
            }
        } else {
            // 清除保存的账号和密码
            mmkv.removeValuesForKeys(new String[]{"account", "password"});
        }
    }
}

activity_main:

html 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
      >

    <RelativeLayout
        android:id="@+id/login_view"
        android:layout_width="400dp"
        android:layout_height="800dp"
        android:layout_centerInParent="true">

        <Button
            android:id="@+id/login_btn_register"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/login_btn_login"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="10dp"
            android:background="#e52525"
            android:text="注册"
            android:textColor="#ffffff"
            android:textSize="20dp" />

        <Button
            android:id="@+id/login_btn_login"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/login_edit_pwd"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="52dp"
            android:background="#545bcb"
            android:text="登录"
            android:textColor="#ffffff"
            android:textSize="20dp" />

        <EditText
            android:id="@+id/login_edit_pwd"
            android:layout_width="400dp"
            android:layout_height="60dp"
            android:layout_below="@+id/login_edit_account"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:ems="10"
            android:hint="请输入您的密码"
            android:inputType="textPassword"
            android:textColor="#ffff00" />

        <EditText
            android:id="@+id/login_edit_account"
            android:layout_width="400dp"
            android:layout_height="60dp"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginTop="20dp"
            android:hint="请输入您的用户名"
            android:inputType="textPersonName"
            android:textColor="#ffff00" />

        <CheckBox
            android:id="@+id/Login_Remember"
            android:layout_width="100dp"
            android:layout_height="20dp"
            android:layout_below="@+id/login_edit_pwd"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:checked="false"
            android:text="记住密码"
            android:textSize="15dp" />

        <TextView
            android:id="@+id/login_text_change_pwd"
            android:layout_width="65dp"
            android:layout_height="20dp"
            android:layout_below="@+id/login_edit_pwd"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:text="忘记密码"
            android:textSize="15dp" />
    </RelativeLayout>
</LinearLayout>

运行结果:

四、MMKV与SharedPreferences比较

MMKV相对于SharedPreferences(sp)有以下几个优势:

  1. 性能更好:MMKV使用了自定义的键值存储引擎,底层采用了mmap映射文件的方式,避免了内存拷贝和序列化/反序列化的开销。相比之下,SharedPreferences是基于XML文件的存储,每次读写都需要进行IO操作,性能较低。

  2. 存储容量更大:MMKV支持将数据存储在独立的文件中,并且可以设置单个文件的最大大小,而SharedPreferences则是将数据存储在一个XML文件中,当存储的数据量较大时,性能会下降。

  3. 多进程并发安全:MMKV通过文件锁机制来实现多进程并发安全访问,避免了数据错乱和冲突的问题。而SharedPreferences没有提供多进程并发安全的保证,当多个进程同时对同一个SharedPreferences文件进行操作时,可能会导致数据异常。

  4. 支持自定义加密:MMKV支持自定义的加密器,可以对存储的数据进行加密保护,增加数据的安全性。而SharedPreferences不直接支持加密,需要开发者手动对存储的数据进行加密处理。

  5. API更简洁易用:MMKV提供了简洁易用的API,使用起来更加方便快捷,可以直接存储各种类型的数据,无需手动进行类型转换。而SharedPreferences需要手动进行类型转换和键值的拼接。

总的来说,MMKV相对于SharedPreferences在性能、存储容量、多进程并发安全性和加密等方面有着明显的优势,特别适合用于高性能要求、大数据量存储或多进程场景下的数据存储需求。

相关推荐
千里马学框架4 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo7 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077007 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼8 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone9 小时前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen9 小时前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone9 小时前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui