LightKV is a Lightweight key-value storage component based on Android platform.

SharedPreferences is a convenient way to save key-value, but it's no very efficient.

So we make this LightKV, to make saving data faster.

LightKV has two modes: SyncKV & AsyncKV,
Both of thier API similar to SharePreferences(AsyncKV is unnecessary to commit).
SyncKV submits data atomic (need to commit after updating data, whick like SharePreferences-commit mode);
AsyncKV is faster, it will auto flush data to disk by system.


We make a simple test case (you can see the code in project) to test their loading speed and writing speed.

mode loading time(ms)
AsyncKV 10.46
SyncKV 1.56
SharePreferences 4.99
mode writing time(ms)
AsyncKV 2.25
SyncKV 75.34
SharePreferences-apply 6.90
SharePreferences-commit 279.14

AsyncKV use mmap open mode, so it's slower when loading, but is much faster when writing.

SyncKV and SharePreferences-commit need to flush data to disk every commit, so they use more time in whole test case.

SyncKV is faster comparing with SharePreferences-commit.


repositories {

dependencies {
    implementation 'com.horizon.lightkv:lightkv:1.0.1'



public class AppData {
    private static final SyncKV DATA =
            new LightKV.Builder(GlobalConfig.getAppContext(), "app_data")
                    .encoder(new ConfuseEncoder())

    // keys define
    public interface Keys {
        int SHOW_COUNT = 1 | DataType.INT;

        int ACCOUNT = 1 | DataType.STRING | DataType.ENCODE;
        int TOKEN = 2 | DataType.STRING | DataType.ENCODE;

        int SECRET = 1 | DataType.ARRAY | DataType.ENCODE;

    public static SyncKV data() {
        return DATA;

    public static String getString(int key) {
        return DATA.getString(key);

    public static void putString(int key, String value) {
        DATA.putString(key, value);

    public static byte[] getArray(int key) {
        return DATA.getArray(key);

    public static void putArray(int key, byte[] value) {
        DATA.putArray(key, value);

    public static int getInt(int key) {
        return DATA.getInt(key);

    public static void putInt(int key, int value) {
        DATA.putInt(key, value);

Use case

val showCount = AppData.getInt(AppData.Keys.SHOW_COUNT)
AppData.putInt(AppData.Keys.SHOW_COUNT, showCount + 1)