MMKV
-
Github地址:https://github.com/Tencent/MMKV
-
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。近期也已移植到 Android / macOS / Win32 / POSIX 平台,一并开源。
-
加密前数据:
-
加密后数据:
-
使用方法:
implementation 'com.tencent:mmkv:1.2.14'
private void mmkv() {
//application中初始化
MMKV.initialize(this);
//创建
MMKV kv = MMKV.defaultMMKV();
// MMKV kv = MMKV.defaultMMKV(1,"123456");
kv.encode("bool", true);
boolean bValue = kv.decodeBool("bool");
Log.e(TAG, "mmkv: " + bValue);
kv.encode("str", "Hello from mmkv");
String str = kv.decodeString("str");
Log.e(TAG, "mmkv: " + str);
}
- 性能对比:
(测试机器是 华为 Mate 20 Pro 128G,Android 10,每组操作重复 1k 次,时间单位是 ms。)
DataStore
-
Jetpack DataStore 是一种改进的新数据存储解决方案,允许使用协议缓冲区存储键值对或类型化对象。DataStore 以异步、一致的事务方式存储数据,克服了 SharedPreferences(以下统称为SP)的一些缺点。DataStore基于Kotlin协程和Flow实现,并且可以对SP数据进行迁移,旨在取代SP。
-
Preferences DataStore:与SharedPreferences类似,通过键值对存储数据,此实现不需要预定义模式,也不提供类型安全。
-
Proto DataStore:通过Protocol-Buffers定义存储数据类型以及结构,保证类型安全。
-
存储的数据:
-
DataStore没有自带加密方法,需要自行对数据进行加密。
-
使用方法:
//datastore
implementation "androidx.datastore:datastore-preferences:1.0.0"
// RxJava2
implementation "androidx.datastore:datastore-preferences-rxjava2:1.0.0"
private void dataStore() {
Preferences.Key<String> KEY_USER_NAME = new Preferences.Key<>("username");
Preferences.Key<String> KEY_PASS_WORD = new Preferences.Key<>("password");
//
RxDataStore<Preferences> dataStore = new RxPreferenceDataStoreBuilder(this, /*name=*/ "settings").build();
// 写入
dataStore.updateDataAsync(prefsIn -> {
MutablePreferences mutablePreferences = prefsIn.toMutablePreferences();
mutablePreferences.set(KEY_USER_NAME, "zhangyu");
mutablePreferences.set(KEY_PASS_WORD, "123456");
return Single.just(mutablePreferences);
});
//读取
Flowable<String> userNameFlow =
dataStore.data().map(prefs -> prefs.get(KEY_USER_NAME));
Flowable<String> userPasswdFlow =
dataStore.data().map(prefs -> prefs.get(KEY_PASS_WORD));
Log.e(TAG, "dataStore: username=" + userNameFlow.blockingFirst());
Log.e(TAG, "dataStore: password=" + userPasswdFlow.blockingFirst());
}