An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.

Overview

license PRs Welcome Release Version Platform

中文版本请参看这里

MMKV is an efficient, small, easy-to-use mobile key-value storage framework used in the WeChat application. It's currently available on Android, iOS/macOS, Win32 and POSIX.

MMKV for Android

Features

  • Efficient. MMKV uses mmap to keep memory synced with file, and protobuf to encode/decode values, making the most of Android to achieve best performance.

    • Multi-Process concurrency: MMKV supports concurrent read-read and read-write access between processes.
  • Easy-to-use. You can use MMKV as you go. All changes are saved immediately, no sync, no apply calls needed.

  • Small.

    • A handful of files: MMKV contains process locks, encode/decode helpers and mmap logics and nothing more. It's really tidy.
    • About 50K in binary size: MMKV adds about 50K per architecture on App size, and much less when zipped (apk).

Getting Started

Installation Via Maven

Add the following lines to build.gradle on your app module:

dependencies {
    implementation 'com.tencent:mmkv-static:1.2.10'
    // replace "1.2.10" with any available version
}

Starting from v1.2.8, MMKV has been migrated to Maven Central. Older versions (<= v1.2.7) are still available on JCenter.
For other installation options, see Android Setup.

Quick Tutorial

You can use MMKV as you go. All changes are saved immediately, no sync, no apply calls needed.
Setup MMKV on App startup, say your Application class, add these lines:

public void onCreate() {
    super.onCreate();

    String rootDir = MMKV.initialize(this);
    System.out.println("mmkv root: " + rootDir);
    //……
}

MMKV has a global instance, that can be used directly:

import com.tencent.mmkv.MMKV;
    
MMKV kv = MMKV.defaultMMKV();

kv.encode("bool", true);
boolean bValue = kv.decodeBool("bool");

kv.encode("int", Integer.MIN_VALUE);
int iValue = kv.decodeInt("int");

kv.encode("string", "Hello from mmkv");
String str = kv.decodeString("string");

MMKV also supports Multi-Process Access. Full tutorials can be found here Android Tutorial.

Performance

Writing random int for 1000 times, we get this chart:

For more benchmark data, please refer to our benchmark.

MMKV for iOS/macOS

Features

  • Efficient. MMKV uses mmap to keep memory synced with file, and protobuf to encode/decode values, making the most of iOS/macOS to achieve best performance.

  • Easy-to-use. You can use MMKV as you go, no configurations needed. All changes are saved immediately, no synchronize calls needed.

  • Small.

    • A handful of files: MMKV contains encode/decode helpers and mmap logics and nothing more. It's really tidy.
    • Less than 30K in binary size: MMKV adds less than 30K per architecture on App size, and much less when zipped (ipa).

Getting Started

Installation Via CocoaPods:

  1. Install CocoaPods;
  2. Open terminal, cd to your project directory, run pod repo update to make CocoaPods aware of the latest available MMKV versions;
  3. Edit your Podfile, add pod 'MMKV' to your app target;
  4. Run pod install;
  5. Open the .xcworkspace file generated by CocoaPods;
  6. Add #import <MMKV/MMKV.h> to your source file and we are done.

For other installation options, see iOS/macOS Setup.

Quick Tutorial

You can use MMKV as you go, no configurations needed. All changes are saved immediately, no synchronize calls needed. Setup MMKV on App startup, in your -[MyApp application: didFinishLaunchingWithOptions:], add these lines:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // init MMKV in the main thread
    [MMKV initializeMMKV:nil];

    //...
    return YES;
}

MMKV has a global instance, that can be used directly:

MMKV *mmkv = [MMKV defaultMMKV];
    
[mmkv setBool:YES forKey:@"bool"];
BOOL bValue = [mmkv getBoolForKey:@"bool"];
    
[mmkv setInt32:-1024 forKey:@"int32"];
int32_t iValue = [mmkv getInt32ForKey:@"int32"];
    
[mmkv setString:@"hello, mmkv" forKey:@"string"];
NSString *str = [mmkv getStringForKey:@"string"];

MMKV also supports Multi-Process Access. Full tutorials can be found here.

Performance

Writing random int for 10000 times, we get this chart:

For more benchmark data, please refer to our benchmark.

MMKV for Win32

Features

  • Efficient. MMKV uses mmap to keep memory synced with file, and protobuf to encode/decode values, making the most of Windows to achieve best performance.

    • Multi-Process concurrency: MMKV supports concurrent read-read and read-write access between processes.
  • Easy-to-use. You can use MMKV as you go. All changes are saved immediately, no save, no sync calls needed.

  • Small.

    • A handful of files: MMKV contains process locks, encode/decode helpers and mmap logics and nothing more. It's really tidy.
    • About 10K in binary size: MMKV adds about 10K on application size, and much less when zipped.

Getting Started

Installation Via Source

  1. Getting source code from git repository:

    git clone https://github.com/Tencent/MMKV.git
    
  2. Add Win32/MMKV/MMKV.vcxproj to your solution;

  3. Add MMKV project to your project's dependencies;

  4. Add $(OutDir)include to your project's C/C++ -> General -> Additional Include Directories;

  5. Add $(OutDir) to your project's Linker -> General -> Additional Library Directories;

  6. Add MMKV.lib to your project's Linker -> Input -> Additional Dependencies;

  7. Add #include <MMKV/MMKV.h> to your source file and we are done.

note:

  1. MMKV is compiled with MT/MTd runtime by default. If your project uses MD/MDd, you should change MMKV's setting to match your project's (C/C++ -> Code Generation -> Runtime Library), or vise versa.
  2. MMKV is developed with Visual Studio 2017, change the Platform Toolset if you use a different version of Visual Studio.

For other installation options, see Win32 Setup.

Quick Tutorial

You can use MMKV as you go. All changes are saved immediately, no sync, no save calls needed.
Setup MMKV on App startup, say in your main(), add these lines:

#include <MMKV/MMKV.h>

int main() {
    std::wstring rootDir = getYourAppDocumentDir();
    MMKV::initializeMMKV(rootDir);
    //...
}

MMKV has a global instance, that can be used directly:

auto mmkv = MMKV::defaultMMKV();

mmkv->set(true, "bool");
std::cout << "bool = " << mmkv->getBool("bool") << std::endl;

mmkv->set(1024, "int32");
std::cout << "int32 = " << mmkv->getInt32("int32") << std::endl;

mmkv->set("Hello, MMKV for Win32", "string");
std::string result;
mmkv->getString("string", result);
std::cout << "string = " << result << std::endl;

MMKV also supports Multi-Process Access. Full tutorials can be found here Win32 Tutorial.

MMKV for POSIX

Features

  • Efficient. MMKV uses mmap to keep memory synced with file, and protobuf to encode/decode values, making the most of POSIX to achieve best performance.

    • Multi-Process concurrency: MMKV supports concurrent read-read and read-write access between processes.
  • Easy-to-use. You can use MMKV as you go. All changes are saved immediately, no save, no sync calls needed.

  • Small.

    • A handful of files: MMKV contains process locks, encode/decode helpers and mmap logics and nothing more. It's really tidy.
    • About 7K in binary size: MMKV adds about 7K on application size, and much less when zipped.

Getting Started

Installation Via CMake

  1. Getting source code from git repository:

    git clone https://github.com/Tencent/MMKV.git
    
  2. Edit your CMakeLists.txt, add those lines:

    add_subdirectory(mmkv/POSIX/src mmkv)
    target_link_libraries(MyApp
        mmkv)
  3. Add #include "MMKV.h" to your source file and we are done.

For other installation options, see POSIX Setup.

Quick Tutorial

You can use MMKV as you go. All changes are saved immediately, no sync, no save calls needed.
Setup MMKV on App startup, say in your main(), add these lines:

#include "MMKV.h"

int main() {
    std::string rootDir = getYourAppDocumentDir();
    MMKV::initializeMMKV(rootDir);
    //...
}

MMKV has a global instance, that can be used directly:

auto mmkv = MMKV::defaultMMKV();

mmkv->set(true, "bool");
std::cout << "bool = " << mmkv->getBool("bool") << std::endl;

mmkv->set(1024, "int32");
std::cout << "int32 = " << mmkv->getInt32("int32") << std::endl;

mmkv->set("Hello, MMKV for Win32", "string");
std::string result;
mmkv->getString("string", result);
std::cout << "string = " << result << std::endl;

MMKV also supports Multi-Process Access. Full tutorials can be found here POSIX Tutorial.

License

MMKV is published under the BSD 3-Clause license. For details check out the LICENSE.TXT.

Change Log

Check out the CHANGELOG.md for details of change history.

Contributing

If you are interested in contributing, check out the CONTRIBUTING.md, also join our Tencent OpenSource Plan.

To give clarity of what is expected of our members, MMKV has adopted the code of conduct defined by the Contributor Covenant, which is widely used. And we think it articulates our values well. For more, check out the Code of Conduct.

FAQ & Feedback

Check out the FAQ first. Should there be any questions, don't hesitate to create issues.

You might also like...
StorageManager - FileManager framework that handels Store, fetch, delete and update files in local storage
StorageManager - FileManager framework that handels Store, fetch, delete and update files in local storage

StorageManager - FileManager framework that handels Store, fetch, delete and update files in local storage. Requirements iOS 8.0+ / macOS 10.10+ / tvOS

Disk is a powerful and simple file management library built with Apple's iOS Data Storage Guidelines in mind
Disk is a powerful and simple file management library built with Apple's iOS Data Storage Guidelines in mind

Disk is a powerful and simple file management library built with Apple's iOS Data Storage Guidelines in mind

🛶Shallows is a generic abstraction layer over lightweight data storage and persistence.

Shallows Shallows is a generic abstraction layer over lightweight data storage and persistence. It provides a StorageKey, Value type, instances of w

pick the voice from the local storage.you can play and pause the voice

flutter_add_voice A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you starte

Your Data Storage Troubleshooter 🛠
Your Data Storage Troubleshooter 🛠

Your Data Storage Troubleshooter 🛠 Introduction StorageKit is a framework which reduces the complexity of managing a persistent layer. You can easily

Easiest local storage library in Swift
Easiest local storage library in Swift

SundeedQLite SundeedQLite is the easiest offline database integration, built using Swift language Requirements iOS 12.0+ XCode 10.3+ Swift 5+ Installa

A CLI tool for the survey of the SSH-Key strength in your GitHub organization members.

GitHub organization SSH-keys checker A CLI tool for the survey of the SSH-Key strength in your GitHub organization members. Requirements macOS 12.0+ S

📕A single value proxy for NSUserDefaults, with clean API.

OneStore A single value proxy for NSUserDefaults, with clean API. With OneStore… Create one proxy(an OneStore object) for each NSUserDefaults value. M

This project has been developed to understand GraphQL and Diffable Data Source. Created on 20.06.2022.

SpaceX Launches First in first. You need to build all packages before building the project. Packages: Extensions API Open Extensions folder under proj

Comments
  • Func 'doFullWriteBack' in place update mmap file,  will corrupt file when func is not finished but  process exit.

    Func 'doFullWriteBack' in place update mmap file, will corrupt file when func is not finished but process exit.

      memmoveDictionary
    ----
      vec.reserve(dic.size());
       or (auto &itr : dic) {
            vec.push_back(&itr.second);
      }
    

    Dict is written back follow the vec order. When crashed in the middle, recoverd key value pairs in the file are not follow the order user set it, may contain some old value and some new value, but lost the others.

    So unfinished write back may put the key value pairs in a crazy state silently.

    opened by CodeLife2012 13
  • Add flutter test, please!

    Add flutter test, please!

    Note:

    no

    The language of MMKV

    dart, flutter

    The version of MMKV

    latest

    The platform of MMKV

    no

    The installation of MMKV

    flutter

    What's the issue?

    Awesome project! Add flutter test, make it better, please!

    What's the log of MMKV when that happened?

    no

    opened by vance-liu 2
Releases(v1.2.14)
  • v1.2.14(Aug 10, 2022)

    v1.2.14 / 2022-08-10

    Changes for All platforms

    • Fix a bug that MMKV.getXXX() may return invalid results in multi-process mode.

    Android

    • Return [] instead of null on empty StringSet from MMKV.decodeStringSet() methods.
    • Upgrade Android Compile & Target SDK to 32.

    iOS

    • Protect from the crash in -[MMKV getObject:forKey:] method when the key-value doesn't exist.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.13(Mar 30, 2022)

    v1.2.13 / 2022-03-30

    Android

    • Fix crash on using Ashmem while MMKV_DISABLE_CRYPT macro is defined.

    iOS

    • Add ability to retrieve key existece while getting value, aka -[MMKV getXXX:forKey:hasValue:] methods.

    POSIX

    • Add ability to retrieve key existece while getting value, aka MMKV::getXXX(key, defaultValue, hasValue) methods.

    Win32

    • Add ability to retrieve key existece while getting value, aka MMKV::getXXX(key, defaultValue, hasValue) methods.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.12(Jan 17, 2022)

    v1.2.12 / 2022-01-17

    Changes for All platforms

    • Fix a bug that a subsequential clearAll() call may fail to take effect in multi-process mode.
    • Hide some OpenSSL symbols to prevent link-time symbol conflict, when an App somehow also static linking OpenSSL.

    Android

    • Upgrade compileSdkVersion & targetSdkVersion from 30 to 31.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.11(Oct 26, 2021)

    v1.2.11 / 2021-10-26

    Android

    • Due to increasing report about crash inside STL, we have decided to make MMKV static linking libc++ by default. Starting from v1.2.11, com.tencent:mmkv-static is the same as com.tencent:mmkv.
    • For those still in need of MMKV with shared linking of libc++_shared, you could use com.tencent:mmkv-shared instead.
    • Add backup & restore ability.

    iOS / macOS

    • Add backup & restore ability.
    • Support tvOS.
    • Fix a compile error on some old Xcode.

    Flutter (v1.2.12)

    • Add backup & restore ability.

    POSIX / golang / Python

    • Add backup & restore ability.
    • Fix a compile error on Gentoo.

    Win32

    • Add backup & restore ability.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.10(Jun 25, 2021)

    v1.2.10 / 2021-06-25

    This version is mainly for Android & Flutter.

    Android

    • Complete JavaDoc documentation for all public methods, classes, and interfaces. From now on, you can find the API reference online.
    • Drop the support of armeabi arch. Due to some local build cache mistake, the last version (v1.2.9) of MMKV still has an unstripped armeabi arch inside. This is fixed.
    • Change MMKV.mmkvWithID() from returning null to throwing exceptions on any error.
    • Add MMKV.actualSize() to get the actual used size of the file.
    • Mark MMKV.commit() & MMKV.apply() as deprecated, to avoid some misuse after migration from SharedPreferences to MMKV.

    Flutter (v1.2.11)

    • Bug Fixed: When building on iOS, occasionally it will fail on symbol conflict with other libs. We have renamed all public native methods to avoid potential conflict.
    • Keep up with MMKV native lib v1.2.10.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.9(May 26, 2021)

    v1.2.9 / 2021-05-26

    This version is mainly for Android & Flutter.

    Android

    • Drop the support of armeabi arch. As has been mention in the last release, to avoid some crashes on the old NDK (r16b), and make the most of a more stable libc++, we have decided to upgrade MMKV's building NDK in this release. That means we can't support armeabi anymore. Those who still in need of armeabi can build from sources by following the instruction in the wiki.

    We really appreciate your understanding.

    Flutter (v1.2.10)

    • Bug Fixed: When calling MMKV.encodeString() with an empty string value on Android, MMKV.decodeString() will return null.
    • Bug Fixed: After upgrading from Flutter 1.20+ to 2.0+, calling MMKV.defaultMMKV() on Android might fail to load, you can try calling MMKV.defaultMMKV(cryptKey: '\u{2}U') with an encrytion key '\u{2}U' instead.
    • Keep up with MMKV native lib v1.2.9.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.8(May 6, 2021)

    v1.2.8 / 2021-05-06

    This will be the last version that supports armeabi arch on Android. To avoid some crashed on the old NDK (r16b), and make the most of a more stable libc++, we have decided to upgrade MMKV's building NDK in the next release. That means we can't support armeabi anymore.

    We really appreciate your understanding.

    Android

    • Migrate MMKV to Maven Central Repository. For versions older than v1.2.7 (including), they are still available on JCenter.
    • Add MMKV.disableProcessModeChecker(). There are some native crash reports due to the process mode checker. You can disable it manually.
    • For the same reason described above (native crashed), MMKV will now turn off the process mode checker on a non-debuggable app (aka, a release build).
    • For MMKV to detect whether the app is debuggable or not, when calling MMKV.initialize() to customize the root directory, a context parameter is required now.

    iOS / macOS

    • Min iOS support has been upgrade to iOS 9.
    • Support building by Xcode 12.

    Flutter

    • Support null-safety.
    • Upgrade to flutter 2.0.
    • Fix a crash on the iOS when calling encodeString() with an empty string value.

    Known Issue on Flutter

    • When calling encodeString() with an empty string value on Android, decodeString() will return null. This bug will be fixed in the next version of Android Native Lib. iOS does not have such a bug.

    Win32

    • Fix a compile error on Visual Studio 2019.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.7(Dec 25, 2020)

    v1.2.7 / 2020-12-25

    Happy holidays everyone!

    Changes for All platforms

    • Fix a bug when calling sync() with false won't do msync() asynchronous and won't return immediately.

    Android

    • Fix an null pointer exception when calling putStringSet() with null.
    • Complete review of all MMKV methods about Java nullable/nonnull annotation.
    • Add API for MMKV.initialize() with both Context and LibLoader parammeters.

    Flutter

    • Fix a crash on the iOS simulator when accessing the default MMKV instance.
    • Fix a bug on iOS when initing the default MMKV instance with a crypt key, the instance is still in plaintext.

    Golang

    Add golang for POSIX platforms. Most things actually work!. Check out the wiki for information.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.6-golang(Dec 17, 2020)

  • v1.2.6(Nov 27, 2020)

    v1.2.6 / 2020-11-27

    Changes for All platforms

    • Fix a file corruption when calling reKey() after removeKeys() has just been called.

    Android

    • Fix compile error when MMKV_DISABLE_CRYPT is set.
    • Add a preprocess directive MMKV_DISABLE_FLUTTER to disable flutter plugin features. If you integrate MMKV by source code, and if you are pretty sure the flutter plugin is not needed, you can turn that off to save some binary size.

    Flutter

    Add MMKV support for Flutter on iOS & Android platform. Most things actually work!
    Check out the wiki for more info.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.5(Nov 13, 2020)

    v1.2.5 / 2020-11-13

    This is a pre-version for Flutter. The official Flutter plugin of MMKV will come out soon. Stay Tune!

    iOS / macOS

    • Fix an assert error of encrypted MMKV when encoding some <NSCoding> objects.
    • Fix a potential leak when decoding duplicated keys from the file.
    • Add +[MMKV pageSize], +[MMKV version] methods.
    • Add +[MMKV defaultMMKVWithCryptKey:], you can encrypt the default MMKV instance now, just like the Android users who already enjoy this for a long time.
    • Rename -[MMKV getValueSizeForKey:] to -[MMKV getValueSizeForKey: actualSize:] to align with Android interface.

    Android

    • Fix a potential crash when getting MMKV instances in multi-thread at the same time.
    • Add MMKV.version() method.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.4(Oct 21, 2020)

    v1.2.4 / 2020-10-21

    This is a hotfix mainly for iOS.

    iOS / macOS

    • Fix a decode error of encrypted MMKV on some devices.

    Android

    • Fix a potential issue on checking rootDir in multi-thread while MMKV initialization is not finished.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.3(Oct 16, 2020)

    v1.2.3 / 2020-10-16

    Changes for All platforms

    • Fix a potential crash on 32-bit devices due to pointer alignment issue.
    • Fix a decode error of encrypted MMKV on some 32-bit devices.

    iOS / macOS

    • Fix a potential crc32() crash on some kind of arm64 devices.
    • Fix a potential crash after calling +[MMKV onAppTerminate].

    Android

    • Fix a rare lock conflict on checkProcessMode().

    POSIX

    Add MMKV support for Python on POSIX platforms. Most things actually work!
    Check out the wiki for more info.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.2-python(Sep 2, 2020)

  • v1.2.2(Aug 2, 2020)

    v1.2.2 / 2020-07-30

    iOS / macOS

    • Add auto clean up feature. Call +[MMKV enableAutoCleanUp:] to enable auto cleanup MMKV instances that not been accessed recently.
    • Fix a potential crash on devices under iPhone X.

    Android

    • Add multi-process mode check. After so many issues had been created due to mistakenly using MMKV in multi-process mode in Android, this check is added. If an MMKV instance is accessed with SINGLE_PROCESS_MODE in multi-process, an IllegalArgumentException will be thrown.

    POSIX

    • Add support for armv7 & arm64 arch on Linux.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Jul 3, 2020)

    v1.2.1 / 2020-07-03

    This is a hotfix version. Anyone who has upgraded to v1.2.0 should upgrade to this version immediately.

    • Fix a potential file corruption bug when writing a file that was created in versions older than v1.2.0. This bug was introduced in v1.2.0.
    • Add a preprocess directive MMKV_DISABLE_CRYPT to turn off MMKV encryption ability once and for all. If you integrate MMKV by source code, and if you are pretty sure encryption is not needed, you can turn that off to save some binary size.
    • The parameter relativePath (customizing a separate folder for an MMKV instance), has been renamed to rootPath. Making it clear that an absolute path is expected for that parameter.

    iOS / macOS

    • -[MMKV mmkvWithID: relativePath:] is deprecated. Use -[MMKV mmkvWithID: rootPath:] instead.
    • Likewise, -[MMKV mmkvWithID: cryptKey: relativePath:] is deprecated. Use -[MMKV mmkvWithID: cryptKey: rootPath:] instead.
    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Jul 2, 2020)

    v1.2.0 / 2020-06-30

    This is the second major version of MMKV. Everything you call is the same as the last version, while almost everything underneath has been improved.

    • Reduce Memory Footprint. We used to cache all key-values in a dictionary for efficiency. From now on we store the offset of each key-value inside the mmap-memory instead, reducing memory footprint by almost half for (non-encrypt) MMKV. And the accessing efficiency is almost the same as before. As for encrypted MMKV, we can't simply store the offset of each key-value, the relative encrypt info needs to be stored as well. That will be too much for small key-values. We only store such info for large key-values (larger than 256B).
    • Improve Writeback Efficiency. Thanks to the optimization above, we now can implement writeback by simply calling memmove() multiple times. Efficiency is increased and memory consumption is down.
    • Optimize Small Key-Values. Small key-values of encrypted MMKV are still cached in memory, as all the old versions did. From now on, the struct MMBuffer will try to store small values in the stack instead of in the heap, saving a lot of time from malloc() & free(). In fact, all primitive types will be store in the stack memory.

    All of the improvements above are available to all supported platforms. Here are the additional changes for each platform.

    iOS / macOS

    • Optimize insert & delete. Especially for inserting new values to existing keys, or deleting keys. We now use the UTF-8 encoded keys in the mmap-memory instead of live encoding from keys, cutting the cost of string encoding conversion.
    • Fix Xcode compile error on some projects.
    • Drop the support of iOS 8. thread_local is not available on iOS 8. We choose to drop support instead of working around because iOS 8's market share is considerably small.

    POSIX

    • It's known that GCC before 5.0 doesn't support C++17 standard very well. You should upgrade to the latest version of GCC to compile MMKV.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.2(May 29, 2020)

    v1.1.2 / 2020-05-29

    Android / iOS & macOS / Win32 / POSIX

    • Fix a potential crash after trim() a multi-process MMKV instance.
    • Improve clearAll() a bit.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Apr 13, 2020)

    v1.1.1 / 2020-04-13

    iOS / macOS

    • Support WatchOS.
    • Rename +[MMKV onExit] to +[MMKV onAppTerminate], to avoid naming conflict with some other OpenSource projects.
    • Make background write protection much more robust, fix a potential crash when writing meta info in background.
    • Fix a potential data corruption bug when writing a UTF-8 (non-ASCII) key.

    Android

    • Fix a crash in the demo project when the App is hot reloaded.
    • Improve wiki & readme to recommend users to init & destruct MMKV in the Application class instead of the MainActivity class.

    POSIX

    • Fix two compile errors with some compilers.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Mar 26, 2020)

    v1.1.0 / 2020-03-24

    This is the first major breaking version ever since MMKV was made public in September 2018, introducing bunches of improvement. Due to the Covid-19, it has been delayed for about a month. Now it's finally here!

    • Improved File Recovery Strategic. We store the CRC checksum & actual file size on each sync operation & full write back, plus storing the actual file size in the same file(aka the .crc meta file) as the CRC checksum. Base on our usage inside WeChat on the iOS platform, it cuts the file corruption rate down by almost half.
    • Unified Core Library. We refactor the whole MMKV project and unify the cross-platform Core library. From now on, MMKV on iOS/macOS, Android, Win32 all share the same core logic code. It brings many benefits such as reducing the work to fix common bugs, improvements on one platform are available to other platforms immediately, and much more.
    • Supports POSIX Platforms. Thanks to the unified Core library, we port MMKV to POSIX platforms easily.
    • Multi-Process Access on iOS/macOS. Thanks to the unified Core library, we add multi-process access to iOS/macOS platforms easily.
    • Efficiency Improvement. We make the most of armv8 ability including the AES & CRC32 instructions to tune encryption & error checking speed up by one order higher than before on armv8 devices. There are bunches of other speed tuning all around the whole project.

    Here are the old-style change logs of each platform.

    iOS / macOS

    • Adds multi-process access support. You should initialize MMKV by calling +[MMKV initializeMMKV: groupDir: logLevel:], passing your shared folder by calling -[NSFileManager containerURLForSecurityApplicationGroupIdentifier:] with app group id. Then you can get a multi-process instance by calling +[MMKV mmkvWithID: mode:] or +[MMKV mmkvWithID: cryptKey: mode:], accessing it cross your app & your app extensions.
    • Add inter-process content change notification. You can get MMKV changes notification of other processes by implementing - onMMKVContentChange: of <MMKVHandler> protocol.
    • Improved File Recovery Strategic. Cuts the file corruption rate down by almost half. Details are above.
    • Efficiency Improvement. Encryption & error checking speed are up by one order higher on armv8 devices(aka iDevice including iPhone 5S and above). Encryption on armv7 devices is improved as well. Details are ahead.
    • Other speed improvements. Refactor core logic using MRC, improve std::vector push_back() speed by using move constructors & move assignments.
    • +[MMKV setMMKVBasePath:] & +[MMKV setLogLevel:] are marked deprecated. You should use +[MMKV initializeMMKV:] or +[MMKV initializeMMKV: logLevel:] instead.
    • The MMKVLogLevel enum has been improved in Swift. It can be used like MMKVLogLevel.info and so on.

    Android

    • Improved File Recovery Strategic. Cuts the file corruption rate down by almost half. Details are above.
    • Efficiency Improvement. Encryption & error checking speed are up by one order higher on armv8 devices with the arm64-v8a abi. Encryption on armeabi & armeabi-v7a is improved as well. Details are ahead.
    • Add exception inside core encode & decode logic, making MMKV much more robust.
    • Other speed improvements. Improve std::vector push_back() speed by using move constructors & move assignments.

    Win32

    • Improved File Recovery Strategic. Cuts the file corruption rate down by almost half. Details are above.
    • Add exception inside core encode & decode logic, making MMKV much more robust.
    • Other speed improvements. Improve std::vector push_back() speed by using move constructors & move assignments.

    POSIX

    • Most things actually work! We have tested MMKV on the latest version of Linux(Ubuntu, Arch Linux, CentOS, Gentoo), and Unix(macOS, FreeBSD, OpenBSD) by the time v1.1.0 is released.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.24(Jan 17, 2020)

    v1.0.24 / 2020-01-16

    iOS / macOS

    What's new

    • Fix a bug that MMKV will fail to save any key-values after calling -[MMKV clearMemoryCache] and then -[MMKV clearAll].
    • Add -[MMKV initializeMMKV:] for users to init MMKV in the main thread, to avoid an iOS 13 potential crash when accessing UIApplicationState in child threads.
    • Fix a potential crash when writing a uniquely constructed string.
    • Fix a performance slow down when acquiring MMKV instances too often.
    • Make the baseline test in MMKVDemo more robust to NSUserDefaults' caches.

    Android

    What's new

    • Fix flock() bug on ashmem files in Android.
    • Fix a potential crash when writing a uniquely constructed string.
    • Fix a bug that the MMKVDemo might crash when running in a simulator.

    Win32

    • Fix a potential crash when writing a uniquely constructed string or data.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.23(Sep 3, 2019)

    v1.0.23 / 2019-09-03

    iOS / macOS

    What's new

    • Fix a potential security leak on encrypted MMKV.

    Android

    What's new

    • Fix a potential security leak on encrypted MMKV.
    • Fix filename bug when compiled on Win32 environment.
    • Add option for decoding String Set into other Set<> classes other than the default HashSet<String>, check decodeStringSet() for details.
    • Add putBytes() & getBytes(), to make function names more clear and consistent.
    • Add notification of content changed by other process, check the new MMKVContentChangeNotification<> interface & checkContentChangedByOuterProcess() for details.

    Win32

    What's new

    • Fix a potential security leak on encrypted MMKV.
    • Fix CriticalSection init bug.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.22(Jun 10, 2019)

    v1.0.22 / 2019-06-10

    iOS / macOS

    What's new

    • Fix a bug that MMKV will corrupt while adding just one key-value, and reboot or clear memory cache. This bug was introduced in v1.0.21.

    Android

    What's new

    • Fix a bug that MMKV will corrupt while adding just one key-value, and reboot or clear memory cache. This bug was introduced in v1.0.21.

    Win32

    What's new

    • Fix a bug that MMKV will corrupt while adding just one key-value, and reboot or clear memory cache. This bug was introduced in v1.0.21.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.20(Jun 5, 2019)

    v1.0.20 / 2019-06-05

    iOS / macOS

    What's new

    • Fix a bug that MMKV might crash while storing key-value with specific length.
    • Fix a bug that -[MMKV trim] might not work properly.

    Android

    What's new

    • Migrate to AndroidX library.
    • Fix a bug that MMKV might crash while storing key-value with specific length.
    • Fix a bug that trim() might not work properly.
    • Fix a bug that dead-lock might be reported by Android mistakenly.
    • Using RegisterNatives() to simplify native method naming.

    Win32

    • Fix a bug that MMKV might crash while storing key-value with specific length.
    • Fix a bug that trim() might not work properly.
    • Fix a bug that clearAll() might not work properly.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.19(Apr 22, 2019)

    v1.0.19 / 2019-04-22

    iOS / macOS

    What's new

    • Support Swift 5.
    • Add method to get all keys -[MMKV allKeys];
    • Add method to synchronize to file asynchronously -[MMKV async].
    • Fix a pod configuration bug that might override target project's C++ setting on CLANG_CXX_LANGUAGE_STANDARD.
    • Fix a bug that DEFAULT_MMAP_SIZE might not be initialized before getting any MMKV instance.
    • Fix a bug that openssl's header files included inside MMKV might mess with target project's own openssl implementation.

    Android

    What's new

    • Support Android Q.
    • Add method to synchronize to file asynchronously void sync(), or void apply() that comes with SharedPreferences.Editor interface.
    • Fix a bug that a buffer with length of zero might be returned when the key is not existed.
    • Fix a bug that DEFAULT_MMAP_SIZE might not be initialized before getting any MMKV instance.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.18(Mar 14, 2019)

    v1.0.18 / 2019-03-14

    iOS / macOS

    What's new

    • Fix a bug that defaultValue was not returned while decoding a NSCoding value.
    • Fix a compile error on static linking MMKV while openssl is static linked too.

    Android

    What's new

    • Introducing Native Buffer. Checkout wiki for details.
    • Fix a potential crash when trying to recover data from file length error.
    • Protect from mistakenly passing Context.MODE_MULTI_PROCESS to init MMKV.

    Win32

    • Fix a potential crash when trying to recover data from file length error.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.17(Jan 25, 2019)

    v1.0.17 / 2019-01-25

    iOS / macOS

    What's new

    • Redirect logging of MMKV is supported now.
    • Dynamically disable logging of MMKV is supported now.
    • Add method migrateFromUserDefaults to import from NSUserDefaults.

    Android

    What's new

    • Redirect logging of MMKV is supported now.
    • Dynamically disable logging of MMKV is supported now.
      Note: These two are breaking changes for interface MMKVHandler, update your implementation with wantLogRedirecting() & mmkvLog() for v1.0.17. (Interface with default method requires API level 24, sigh...)
    • Add option to use custom library loader initialize(String rootDir, LibLoader loader). If you're facing System.loadLibrary() crash on some low API level device, consider using ReLinker to load MMKV. Example can be found in mmkvdemo.
    • Fix a potential corruption of meta file on multi-process mode.
    • Fix a potential crash when the meta file is not valid on multi-process mode.

    Win32

    • Redirect logging of MMKV is supported now.
    • Dynamically disable logging of MMKV is supported now.
    • Fix a potential corruption of meta file on multi-process mode.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.16(Jan 4, 2019)

    v1.0.16 / 2019-01-04

    iOS / macOS

    What's new

    • Customizing root folder of MMKV is supported now.
    • Customizing folder for specific MMKV is supported now.
    • Add method getValueSizeForKey: to get value's size of a key.

    Android

    What's new

    • Customizing root folder of MMKV is supported now.
    • Customizing folder for specific MMKV is supported now.
    • Add method getValueSizeForKey() to get value's size of a key.
    • Fix a potential crash when the meta file is not valid.

    Win32

    MMKV for Windows is released now. Most things actually work!

    Source code(tar.gz)
    Source code(zip)
  • v1.0.15(Dec 14, 2018)

    v1.0.15 / 2018-12-13

    iOS / macOS

    What's new

    • Storing NSString/NSData/NSDate directly by calling setString/getSring, setData/getData, setDate/getDate.
    • Fix a potential crash due to divided by zero.

    Android

    What's new

    • Fix a stack overflow crash due to the callback feature introduced by v1.0.13.
    • Fix a potential crash due to divided by zero.

    Win32

    MMKV for Win32 in under construction. Hopefully will come out in next release. For those who are interested, check out branch dev_win32 for the latest development.

    Source code(tar.gz)
    Source code(zip)
  • v1.0.14(Nov 30, 2018)

    v1.0.14 / 2018-11-30

    iOS / macOS

    What's new

    • Setting nil value to reset a key is supported now.
    • Rename boolValue(forKey:) to bool(forKey:) for Swift.

    Android

    What's new

    • Parcelable objects can be stored directly into MMKV now.
    • Setting null value to reset a key is supported now.
    • Fix an issue that MMKV's file size might expand unexpectly large in some case.
    • Fix an issue that MMKV might crash on multi-thread removing and getting on the same key.
    Source code(tar.gz)
    Source code(zip)
Owner
Tencent
Tencent
💾 Safe, statically-typed, store-agnostic key-value storage written in Swift!

Storez ?? Safe, statically-typed, store-agnostic key-value storage Highlights Fully Customizable: Customize the persistence store, the KeyType class,

Kitz 67 Aug 7, 2022
An elegant, fast, thread-safe, multipurpose key-value storage, compatible with all Apple platforms.

KeyValueStorage An elegant, fast, thread-safe, multipurpose key-value storage, compatible with all Apple platforms. Supported Platforms iOS macOS watc

null 3 Aug 21, 2022
Typed key-value storage solution to store Codable types in various persistence layers with few lines of code!

?? Stores A typed key-value storage solution to store Codable types in various persistence layers like User Defaults, File System, Core Data, Keychain

Omar Albeik 94 Dec 31, 2022
WCDB is a cross-platform database framework developed by WeChat.

WCDB 中文版本请参看这里 WCDB is an efficient, complete, easy-to-use mobile database framework used in the WeChat application. It's currently available on iOS,

Tencent 9.6k Jan 8, 2023
CloudKit, Apple’s remote data storage service, provides a possibility to store app data using users’ iCloud accounts as a back-end storage service.

CloudKit, Apple’s remote data storage service, provides a possibility to store app data using users’ iCloud accounts as a back-end storage service. He

Yalantis 252 Nov 4, 2022
macOS WeChat.app header files version history (automatic updated)

macos-wechat-app-tracker macOS WeChat.app header files version history (automatic updated) Troubleshooting $ class-dump -H /Applications/WeChat.app 20

Wechaty 3 Feb 10, 2022
A protocol-centric, type and queue safe key-value workflow.

Light-weight, strict protocol-first styled PropertyKit helps you to easily and safely handle guaranteed values, keys or types on various situations of

gitmerge 12 Feb 26, 2021
YapDB is a collection/key/value store with a plugin architecture. It's built atop sqlite, for Swift & objective-c developers.

YapDatabase is a collection/key/value store and so much more. It's built atop sqlite, for Swift & Objective-C developers, targeting macOS, iOS, tvOS &

Yap Studios 3.3k Dec 29, 2022
Key-Value store for Swift backed by LevelDB

SwiftStore Key/Value store for Swift backed by LevelDB. Usage Create instances of store import SwiftStore // Create a store. let store = SwiftStore(s

Hemanta Sapkota 119 Dec 21, 2022
🇨🇳 Learn how to make WeChat with SwiftUI. 微信 7.0 🟢

Overview Features Screenshots TODO Requirements License 中文 Overview I will continue to follow the development of technology, the goal is to bring Swif

Gesen 937 Dec 20, 2022