安卓: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在性能、存储容量、多进程并发安全性和加密等方面有着明显的优势,特别适合用于高性能要求、大数据量存储或多进程场景下的数据存储需求。

相关推荐
机器视觉小小测试员22 分钟前
自动化测试工具Ranorex Studio(七十五)-录制ANDROID测试
android·测试工具·自动化
van叶~2 小时前
仓颉语言实战——2.名字、作用域、变量、修饰符
android·java·javascript·仓颉
m0_748239332 小时前
【PHP】部署和发布PHP网站到IIS服务器
android·服务器·php
小林爱3 小时前
【Compose multiplatform教程14】【组件】LazyColumn组件
android·前端·kotlin·android studio·框架·多平台
牧杉-惊蛰3 小时前
html转PDF
android·pdf
yangfeipancc10 小时前
数据库-用户管理
android·数据库
字节流动10 小时前
Android Java 版本的 MSAA OpenGL ES 多重采样
android·java·opengles
xuanfengwuxiang10 小时前
安卓帧率获取
android·python·测试工具·adb·性能优化·pycharm
柯南二号14 小时前
Task ‘wrapper‘ not found in project ‘:example‘. 报错解决
android·gradle·hippy
我又来搬代码了14 小时前
【Android】项目升级时报错 android:style/Holo.Widget
android·gitee