6 个版本

0.5.3 2024年7月29日
0.5.0 2024年4月29日
0.4.4 2024年2月16日
0.4.0 2023年12月18日
0.3.2 2023年11月28日

#272数据库接口

Download history 148/week @ 2024-04-26 14/week @ 2024-05-03 5/week @ 2024-05-17 2/week @ 2024-05-24 67/week @ 2024-06-28 43/week @ 2024-07-05 1/week @ 2024-07-12 111/week @ 2024-07-26 17/week @ 2024-08-02

每月 129 次下载

MIT/Apache

110KB
3K SLoC

库使用基于文件的 mmap 来存储键值

Crates.io PRs Welcome Crates.io Crates.io Cargo Test Android Build Check Swift Test

这是 MMKV 的 Rust 版本。

默认情况下,此库使用 CRC8 检查数据完整性。

如果包含功能 encryption,此库将使用 AES-EAX 加密数据。

MMKV 是线程安全的,但不能保证跨进程数据一致性。如果您想在跨进程场景中使用它,请确保没有相互竞争的写入。

如何使用

添加依赖

cargoadd mmkv

然后直接使用 MMKV

use mmkv::{LogLevel, MMKV};

fn main() {
    // Set the log level of the library
    MMKV::set_log_level(LogLevel::Verbose);
    let temp_dir = std::env::temp_dir();
    let dir = temp_dir.join("test1");
    let _ = std::fs::create_dir(&dir);
    // Initialize it with a directory, the library will crate a file,
    // named "mini_mmkv" under this dir.
    let mmkv = MMKV::new(dir.to_str().unwrap());
    // Put and get result, for most case should be Ok(()),
    // if something wrong, it contains the useful info.
    let ret = mmkv.put_i32("key1", 1);
    println!("{:?}", ret); // Ok(())
    // Get result with key
    println!("{:?}", mmkv.get_i32("key1")); // Ok(1)
    // Put and unwrap the result
    mmkv.put_str("key1", "value").unwrap();
    println!("{:?}", mmkv.get_i32("key1")); // Err(TypeMissMatch)
    println!("{:?}", mmkv.get_str("key1")); // Ok("value")

    let dir = temp_dir.join("test2");
    let _ = std::fs::create_dir(&dir);
    // Create another instance with different path
    let new_mmkv = MMKV::new(dir.to_str().unwrap());
    new_mmkv.put_bool("key1", true).unwrap();
    println!("{:?}", new_mmkv.get_bool("key1")); // Ok(true)
    // clear all data to free disk space
    new_mmkv.clear_data();
}

使用加密功能

添加依赖

cargoadd mmkv --功能encryption

然后使用加密凭证初始化 MMKV

letmmkv= MMKV::new(".", "88C51C536176AD8A8EE4A06F62EE897E")

加密会大大降低读写效率,并会增加文件大小,请自行承担风险!

在 Android 项目中使用

在 gradle 中添加库依赖

dependencies {
    implementation("net.yangkx:mmkv:0.4.0")
    // Or another one with encryption feature
    // implementation("net.yangkx:mmkv-encrypt:0.4.0")
}

您可以在 Releases 中找到所有版本。

使用 Kotlin API

class MyApplication : Application() {

    companion object {
        lateinit var mmkv: MMKV
    }

    override fun onCreate() {
        super.onCreate()
        MMKV.setLogLevel(LogLevel.VERBOSE)
        val dir = this.getDir("mmkv", Context.MODE_PRIVATE)
        mmkv = MMKV(dir.absolutePath)
        // If you are using mmkv with encryption
        // mmkv = MMKV(dir.absolutePath, "88C51C536176AD8A8EE4A06F62EE897E")
    }
}

class MainActivity : AppCompatActivity() {

    private val mmkv: MMKV
        get() = MyApplication.mmkv

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        mmkv.putString("first_key", "first value")
        mmkv.putInt("second_key", 1024)
        mmkv.putBool("third_key", true)
        binding.string.text = mmkv.getString("first_key", "default")
        binding.integer.text = mmkv.getInt("second_key", 0).toString()
        binding.bool.text = mmkv.getBool("third_key", false).toString()
    }
}

查看 android 示例以获取更多详细信息。

在 iOS 项目中使用

  1. 将此仓库作为 Swift 包依赖添加到您的 Xcode 项目中。

  2. 在使用 API 之前初始化 MMKV 实例,例如

    import Foundation
    import MMKV
    
    class MMKVManager {
        static var inst = initMMKV()
    }
    
    func initMMKV() -> MMKV {
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentsDirectory = paths[0]
        let docURL = URL(string: documentsDirectory)!
        let dataPath = docURL.appendingPathComponent("mmkv")
        if !FileManager.default.fileExists(atPath: dataPath.path) {
            do {
                try FileManager.default.createDirectory(atPath: dataPath.path, withIntermediateDirectories: true, attributes: nil)
            } catch {
                print(error.localizedDescription)
            }
        }
        return MMKV(dataPath.path)
    }
    
  3. 使用 MMKV.shared 直接访问 API

    import SwiftUI
    import MMKV
    
    struct ContentView: View {
        @State var textContent: String = "Hello, world!"
        var body: some View {
            Text(textContent)
                .onTapGesture {
                    let value = MMKVManager.inst.getInt32(key: "int_key").unwrap(defalutValue: 0)
                    MMKVManager.inst.putInt32(key: "int_key", value: value + 1).unwrap(defalutValue: ())
                    textContent = MMKVManager.inst.getInt32(key: "int_key").unwrap(defalutValue: 0).formatted()
                }
        }
    }
    

查看 ios 示例以获取更多详细信息。

依赖

~3–16MB
~135K SLoC