Android几种数据存储的对比(MMKV、DataStore、SharedPreference)

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());
    }

猜你喜欢

转载自blog.csdn.net/yu540135101/article/details/127882071