android 使用MMKV代替SharePreference

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

完整开源地址:https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF

  • String rootDir = MMKV.initialize(dir);

*/

MMKV.initialize(this);

}

  • 基础数据存储

/**

  • 基础数据存储

*/

private void iniDefault() {

/**

  • 单进程:MMKV.SINGLE_PROCESS_MODE

  • 多进程:MMKV.MULTI_PROCESS_MODE

*/

// mKv = MMKV.defaultMMKV(MMKV.SINGLE_PROCESS_MODE, “123456”);

// 不同业务需要区别存储,单独创建自己的实例

// mKv = MMKV.mmkvWithID(“MyID”);

// MMKV 支持自定义某个文件的目录

// String relativePath = getFilesDir().getAbsolutePath() + “/mmkv_3”;

// MMKV kv = MMKV.mmkvWithID(“MyID”, relativePath);

mKv = MMKV.defaultMMKV();

mStr.append(“基础数据类型\n”);

mStr.append(“boolean数据类型 \n”);

mKv.encode(“bool”, true);

mStr.append(“key=>bool,value=>” + mKv.decodeBool(“bool”) + " \n\n");

mStr.append(“int数据类型 \n”);

mKv.encode(“int”, 2020);

mStr.append(“key=>int,value=>” + mKv.decodeInt(“int”) + " \n\n");

mStr.append(“long数据类型 \n”);

mKv.encode(“long”, Long.MAX_VALUE);

mStr.append(“key=>long,value=>” + mKv.decodeLong(“long”) + " \n\n");

mStr.append(“float数据类型 \n”);

mKv.encode(“float”, 3.14f);

mStr.append(“key=>float,value=>” + mKv.decodeFloat(“float”) + " \n\n");

mStr.append(“double数据类型 \n”);

mKv.encode(“double”, 3.141596265356677897);

mStr.append(“key=>double,value=>” + mKv.decodeDouble(“double”, 3.14) + " \n\n");

mStr.append(“string数据类型 \n”);

mKv.encode(“string”, “我是 MMKV”);

mStr.append(“key=>string,value=>” + mKv.decodeString(“string”) + " \n\n");

mStr.append(“byte[]数据类型 \n”);

byte[] bytes = {‘m’, ‘m’, ‘k’, ‘v’};

mKv.encode(“bytes”, bytes);

mStr.append(“key=>bytes,value=>” + new String(mKv.decodeBytes(“bytes”)) + " \n\n");

mStr.append(“Set数据类型 \n”);

HashSet set = new HashSet<>();

set.add(“H”);

set.add(“U”);

set.add(“A”);

set.add(“N”);

set.add(“G”);

mKv.encode(“HashSet”, set);

mStr.append(“key=>HashSet,value=>” + mKv.decodeStringSet(“HashSet”).toString() + " \n\n");

mStr.append(“存储对象 \n”);

MmkvBean mmkvBean = new MmkvBean();

mmkvBean.setAge(25);

mmkvBean.setName(“huangxiaoguo”);

mmkvBean.setNum(“1201961031”);

mKv.encode(“mmkvBean”, mmkvBean);

MmkvBean mmkvBean1 = mKv.decodeParcelable(“mmkvBean”, MmkvBean.class);

mStr.append(“存储对象数据:” + mmkvBean1.toString() + " \n\n");

mTextView.setText(mStr.toString());

}

  • 删除 & 查询

/**

  • 删除 & 查询

*/

private void initContainRemove() {

mStr.append(“\n删除 & 查询\n”);

mStr.append(“删除单个指定key \n”);

mKv.removeValueForKey(“bool”);

mStr.append(“key=>bool,value=>” + mKv.decodeBool(“bool”) + " \n\n");

mStr.append(“删除多个指定key \n”);

mKv.removeValuesForKeys(new String[]{“int”, “long”});

mStr.append(“key=>int,long,value=>” + mKv.decodeBool(“int”) + “-----” + mKv.decodeBool(“long”) + " \n\n");

mStr.append(“查询所有数据 \n”);

mStr.append(“所有数据:” + Arrays.toString(mKv.allKeys()) + " \n\n");

mStr.append(“查询是否存在某个数据 \n”);

boolean hasStringKey = mKv.containsKey(“string”);

boolean hasString = mKv.contains(“string”);

mStr.append(“是否存在string====>hasStringKey:” + hasStringKey + “; hasString:” + hasString + " \n\n");

mStr.append(“清楚数据 \n”);

mKv.clearAll();

boolean string = mKv.containsKey(“string”);

mStr.append(“清除后是否有数据:” + string + " \n\n");

mTextView.setText(mStr.toString());

}

  • SharedPreferences 迁移

//SharedPreferences preferences = getSharedPreferences(“myData”, MODE_PRIVATE);

MMKV preferences = MMKV.mmkvWithID(“MyID”);

// 迁移旧数据

{

SharedPreferences old_SP = getSharedPreferences(“MyID”, MODE_PRIVATE);

preferences.importFromSharedPreferences(old_SP);

old_SP.edit().clear().commit();

}

// 跟以前用法一样

SharedPreferences.Editor editor = preferences.edit();

editor.putBoolean(“bool”, true);

editor.putInt(“int”, Integer.MIN_VALUE);

editor.putLong(“long”, Long.MAX_VALUE);

editor.putFloat(“float”, -3.14f);

editor.putString(“string”, “HUANG”);

HashSet set = new HashSet();

set.add(“H”);

set.add(“U”);

set.add(“A”);

set.add(“N”);

set.add(“G”);

editor.putStringSet(“set”, set);

// 无需调用 commit()

//editor.commit();

  • 工具类封装

package aa.datastore.mmkv.utils;

import android.os.Parcelable;

import com.tencent.mmkv.MMKV;

import java.util.Collections;

import java.util.Set;

public class SpUtils {

private static MMKV mkv;

private SpUtils() {

mkv = MMKV.defaultMMKV();

}

public static SpUtils getInstance() {

return SingletonHolder.sInstance;

}

//静态内部类

private static class SingletonHolder {

private static final SpUtils sInstance = new SpUtils();

}

/**

  • 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法

  • @param key

  • @param object

*/

public static void encode(String key, Object object) {

if (object instanceof String) {

mkv.encode(key, (String) object);

} else if (object instanceof Integer) {

mkv.encode(key, (Integer) object);

} else if (object instanceof Boolean) {

mkv.encode(key, (Boolean) object);

} else if (object instanceof Float) {

mkv.encode(key, (Float) object);

} else if (object instanceof Long) {

mkv.encode(key, (Long) object);

} else if (object instanceof Double) {

mkv.encode(key, (Double) object);

} else if (object instanceof byte[]) {

mkv.encode(key, (byte[]) object);

} else {

mkv.encode(key, object.toString());

}

}

public static void encodeSet(String key, Set sets) {

mkv.encode(key, sets);

}

public static void encodeParcelable(String key, Parcelable obj) {

mkv.encode(key, obj);

}

/**

  • 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值

  • @param key

  • @param defaultObject

  • @return

*/

public static Object decode(String key, Object defaultObject) {

if (defaultObject instanceof String) {

return mkv.decodeString(key, (String) defaultObject);

} else if (defaultObject instanceof Integer) {

return mkv.decodeInt(key, (Integer) defaultObject);

} else if (defaultObject instanceof Boolean) {

return mkv.decodeBool(key, (Boolean) defaultObject);

} else if (defaultObject instanceof Float) {

return mkv.decodeFloat(key, (Float) defaultObject);

} else if (defaultObject instanceof Long) {

return mkv.decodeLong(key, (Long) defaultObject);

} else if (defaultObject instanceof Double) {

return mkv.decodeDouble(key, (Double) defaultObject);

} else if (defaultObject instanceof byte[]) {

return mkv.decodeBytes(key, (byte[]) defaultObject);

}

return defaultObject;

}

/**

  • 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值

*/

public static Integer decodeInt(String key) {

return mkv.decodeInt(key, 0);

}

public static Double decodeDouble(String key) {

return mkv.decodeDouble(key, 0.00);

}

public static Long decodeLong(String key) {

return mkv.decodeLong(key, 0L);

}

public static Boolean decodeBoolean(String key) {

return mkv.decodeBool(key, false);

}

public static Float decodeFloat(String key) {

return mkv.decodeFloat(key, 0F);

}

public static byte[] decodeBytes(String key) {

return mkv.decodeBytes(key);

}

public static String decodeString(String key) {

return mkv.decodeString(key, “”);

}

public static Set decodeStringSet(String key) {

return mkv.decodeStringSet(key, Collections.emptySet());

}

public static Parcelable decodeParcelable(String key, Class clz) {

return mkv.decodeParcelable(key, clz);

}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值