在安卓中可以使用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方法中添加多一个参数,这个参数最为读取的默认值,在所读取的数据在内存中为空时,默认将这一默认值作为读取到的数据。