目录
一、MMKV介绍
MMKV是一种用于安卓平台的轻量级键值存储库,它提供了一种高效、可靠的方式来在应用程序中存储和读取数据。
1.特点和优势:
- 高性能:相对于传统的SharedPreferences和SQLite等存储方式,MMKV在性能方面表现出色。
- 轻量级:MMKV是一个小巧的库,没有外部依赖,易于集成到现有项目中。
- 多线程支持:MMKV具备良好的多线程支持,可以在并发场景下安全地进行数据读写操作。
- 易用性:MMKV提供简单易用的API,支持各种数据类型的存储和读取操作。
- 数据安全:MMKV采用内置的AES加密机制,保护存储的数据安全。
2.使用指南:
- 引入依赖:在项目的build.gradle文件中添加MMKV的依赖项。
- 初始化MMKV:在应用程序的入口处初始化MMKV实例,可以设置存储路径、加密密钥等参数。
- 存储数据:使用putXXX()方法将数据存储到MMKV中,支持各种数据类型。
- 读取数据:使用getXXX()方法从MMKV中读取数据,并进行相应的类型转换。
- 其他操作:MMKV还提供了删除特定键值、清空所有数据等操作。
3.依赖包:
dependencies {
implementation 'com.tencent:mmkv:1.2.10'
}
二、MMKV的常用方法
1、初始化和获取实例:
String rootDir = MMKV.initialize(context); // 初始化默认根目录
MMKV mmkv = MMKV.defaultMMKV(); // 获取默认的MMKV实例
2、存储数据:
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、读取数据
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、删除数据
mmkv.remove("key"); // 删除指定键值对
mmkv.removeValueForKey("key"); // 同上,作用相同
mmkv.removeValuesForKeys(new String[]{"key1", "key2"}); // 删除多个键值对
mmkv.clearAll(); // 清空所有数据
5、其他操作:
boolean contains = mmkv.containsKey("key"); // 判断是否包含指定的键
int count = mmkv.count(); // 获取存储的数据总数
String[] allKeys = mmkv.allKeys(); // 获取所有存储的键
三、MMKV的使用例子
MainActivity:
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:
<?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在性能、存储容量、多进程并发安全性和加密等方面有着明显的优势,特别适合用于高性能要求、大数据量存储或多进程场景下的数据存储需求。