# Tuke **Repository Path**: simon9102/Tuke ## Basic Information - **Project Name**: Tuke - **Description**: 替代原生SP的方案 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-12-01 - **Last Updated**: 2022-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: Android ## README # Tuke——基于 ObjectStream的 key-value 存储组件


写在开头:感谢ZXHHYJ对Tuke的技术支持

Tuke 是基于 ObjectStream的 key-value 存储组件,稳定性强,使用方便。从 2019 年至今在我个人的软件上使用,在经过了3年的磨练,我写出了Tuke3.0版本,现在一起阅读使用说明吧! `ps:下文使用ObjS替代ObjectStream` ## 为什么不使用SharedPerference和MMKV 传统的SharedPerference的诟病已为人熟知,这里不再列举。早在17年,腾讯就推出了更高性能的MMKV组件,其数据储存的方法是增量更新,但因为使用的二进制结构原因,导致了文件只能增不能减。同时,linux内核的mmap虽是高效的,但也是不稳定的,举个例子:有一个极大的数据,数据写一半的时候突然进程崩溃或者被杀死。那当你再次读取数据的时候会发现所有数据均已丢失。 ## 为什么使用ObjStream 安卓上的Objs使用的是既传统又不传统的I/O操作,他的效率比其他java平台高。当你深入追踪安卓的I/O操作后,你会发现安卓已经对java原始的I/O操作进行了改动,这也是为什么我说他是既传统有不传统的I/O。同时,如果你不喜欢使用安卓的I/O,Tuke可以很轻松的修改,这将会在下文的`进阶用法2`中提及。 ## Tuke 简介 - **数据组织** Tuke采用一个键对应一个文件,文件内储存值。即linux的`万物均是文件`的思想。 - **读写优化** Tuke提供了一个全局的缓存策略,还提供接口允许开发者使用自己的缓存策略。当写入或读取一个文件时,会记录操作的时长,以此作为缓存重要性的依据,Tuke内部使用了lruCache,当缓存的大小超过13*60ms的时候,将会回收使用最少,最不频繁的值。 - **语法糖** Kotlin提供的丰富的语法,`by`作为其中的一员,可以代理属性的读写。利用它,TukeKtx实现了对属性的自动保存和恢复。 ## Android指南 ### 安装引入 Step 1. Add the JitPack repository to your build file Add it in your root build.gradle at the end of repositories: ```grovey allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` Step 2. Add the dependency ```grovey dependencies { implementation 'com.gitee.simon9102:tuke:1.0.0' } ``` ### 快速上手 Tuke分为全局储存和分区储存。 __下述介绍全局储存__ 当使用全局储存的时候,需要进行初始化 ```java Tuke.init(Context) //or Tuke.init(Tuke.Config) ``` 使用Context作为参数时,Tuke会把`data/data/包名/no_backup`作为储存位置,同时使用全局缓存,并记录读写出现的异常(tukeError:xxxxxxxx);(w) 使用Config作为参数时,开发者可以在Config实例化时传入储存位置和数据库名称,并可以链式添加异常记录器和缓存策略 读写删操作 ```java Tuke.tukeWrite(String key,Object value); Tuke.tukeGet(String key, Object def, boolean useMemory); //其中 get方法的def和useMemory是可选参数 Tuke.tukeRemove(String key); Tuke.tukeRemoveAll(); ``` __下述介绍分区储存__ 使用分区储存时,需要new一个Tuke实例 ```java Tuke tuke=new Tuke(Tuke.Config); ``` 读写删操作 `ps:下文中tuke不是Tuke,tuke是一个对象,Tuke是类` ``` tuke.write(String key,Object value); tuke.get(String key, Object def, boolean useMemory); //其中 get方法的def和useMemory是可选参数 tuke.remove(String key); tuke.removeAll(); ``` ### 进阶用法 #### 用法1:使用TukeKtx组件,以通过代理变量实现自动储存读取 使用 ```kotlin var cookie: String by tuke(def: V?,key: String?,useMemory: Boolean,config: Tuke.Config?) ``` by tuke()提供4个参数,每个参数均可以省略。下介绍参数详解 参数 |介绍 ---|:-- def | 取不到值时的默认值,若未使用此参数,默认null key | tuke取值使用的键,若未设置此参数,默认 "当前类名.字段名" useMemory | 是否使用缓存,若未设置此参数,默认false config | 使用某个配置,若未设置此参数,默认全局储存 #### 用法2:自定义储存方式 上文以述,开发者可以自行修改Tuke的源码以实现自己对性能/安全的需求。 Tuke最终的I/O操作并非在Tuke类,而是交给`TukeImpl`实现的,开发者可以自己修改内部write/get的Stream。 ## 问题 & 反馈 如果你遇到了问题,并且想联系我,欢迎提[issues](https://github.com/networm6/Tuke/issues)。