MMKV(MMKV是Tencent开发的一种基于 mmap 的 key-value 存储方案,主要用于移动端存储。)是一种在Android平台上使用的数据存储方式。它基于mmap技术,提供了一种高效的、可扩展的、跨平台的键值存储方案。
使用MMKV前需要在Android项目的APP的gradle 里面添加
implementation 'com.tencent:mmkv:1.2.14'
下面是一个简单的示例,演示了如何在Android上使用MMKV保存数据:
import com.tencent.mmkv.MMKV;
import com.tencent.mmkv.MMKVType;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化MMKV,选择存储路径,通常在应用的私有目录下
String mmkvPath = getApplicationContext().getFilesDir().getAbsolutePath() + "/mmkv";
MMKV.initialize(mmkvPath);
// 设置一个键值对
String key = "testKey";
String value = "Hello, MMKV!";
MMKV.putString(key, value, MMKVType.MMKV_SHORT_TERM);
// 从MMKV中获取一个值
String storedValue = MMKV.getString(key, null);
if (storedValue != null) {
System.out.println("Stored value: " + storedValue);
} else {
System.out.println("Value not found.");
}
}
}
下面提供一个封装好的工具类
public class MMKVUtils<T>{
private static MMKV kv;
/**
* 初始化
* @param context 上下文对象
*/
public static void init(Context context) {
String rootDir = MMKV.initialize(context);
// System.out.println("mmkv root: " + rootDir);
kv = MMKV.defaultMMKV();
// 根据业务区别存储, 附带一个自己的 ID
MMKV kv2 = MMKV.mmkvWithID("MyID");
// 多进程同步支持
MMKV kv3 = MMKV.mmkvWithID("MyID", MMKV.MULTI_PROCESS_MODE);
}
/**
* 指定保存位置初始化
* @param dir dir = getFilesDir().getAbsolutePath() + "/mmkv_2";
*/
public static void init(String dir) {
// String rootDir = MMKV.initialize(dir);
kv = MMKV.defaultMMKV();
}
/**
* Ashmem匿名内存
* @param context 上下文
*/
public static void initAshmem(Context context){
kv = MMKV.mmkvWithAshmemID(context, "Ashmem", 1024,
MMKV.MULTI_PROCESS_MODE, "553646546546");
}
/**
* 迁移SP 到 MMKV
*/
private void importSharedPreferences(Context context) {
MMKV mmkv = MMKV.mmkvWithID("myData");
SharedPreferences old_man = context.getSharedPreferences("myData", Context.MODE_PRIVATE);
// 迁移旧数据
mmkv.importFromSharedPreferences(old_man);
// 清空旧数据
old_man.edit().clear().commit();
}
/*
*用途:增改sp的数组 name-自定义集合的名称
*/
public static <T> Boolean setArray(Context mContext, List<T> list, String name) {
MMKV kv = MMKV.defaultMMKV();
if (list == null || list.size() == 0) { //清空
kv.putInt(name + "size", 0);
int size = kv.getInt(name + "size", 0);
for (int i = 0; i < size; i++) {
if (kv.getString(name + i, null) != null) {
kv.remove(name + i);
}
}
} else {
kv.putInt(name + "size", list.size());
if (list.size() > 20) {
list.remove(0); //只保留后20条记录
}
for (int i = 0; i < list.size(); i++) {
kv.remove(name + i);
kv.remove(new Gson().toJson(list.get(i)));//删除重复数据 先删后加
kv.putString(name + i, new Gson().toJson(list.get(i)));
}
}
return kv.commit();
}
/*
*用途:加载sp的数组 name-自定义集合的名称
*/
public static <T> ArrayList<T> getArray(Context mContext, String name, Class<T> tClass) {
MMKV kv = MMKV.defaultMMKV();
ArrayList<T> list = new ArrayList<T>();
int size = kv.getInt(name + "size", 0);
for (int i = 0; i < size; i++) {
if (kv.getString(name + i, null) != null) {
try {
list.add((T) new Gson().fromJson(kv.getString(name + i, null), tClass));
} catch (Exception e) {
e.printStackTrace();
}
}
}
return list;
}
public static void putBoolean(String key, boolean value) {
kv.encode(key, value);
}
public static Boolean getBoolean(String key) {
return kv.decodeBool(key, false);
}
public static Boolean getBoolean(String key, boolean defValue) {
return kv.decodeBool(key, defValue);
}
public static void putInteger(String key, int value) {
kv.encode(key, value);
}
public static int getInteger(String key) {
return kv.decodeInt(key, 0);
}
public static int getInteger(String key, int defValue) {
return kv.decodeInt(key, defValue);
}
public static void putString(String key, String value) {
kv.encode(key, value);
}
public static String getString(String key) {
return kv.decodeString(key, "");
}
public static String getString(String key, String defaultValue) {
return kv.decodeString(key, defaultValue);
}
/**
* 移除数据Key
* @param key 数据Key
*/
public static void removeKey(String key) {
// 删除数据
kv.removeValueForKey(key);
// mmkv.removeValueForKey("String")
// mmkv.removeValuesForKeys(arrayOf("int","bool"))
// mmkv.containsKey("String")
}
}
这样可以直接调用工具类处理
MMKVUtils.putString("name","这里是名称");
MMKVUtils.putInteger("id",1111);
String name= MMKVUtils.getString("name");
int id=MMKVUtils.getInteger("id",-1);