From bdeaa79f1b661984c763fa382f1cf2ed69f80eea Mon Sep 17 00:00:00 2001 From: zmx Date: Tue, 26 Mar 2024 12:54:25 +0800 Subject: [PATCH 1/2] 1.3.1 --- .../main/java/com/mx/keyvalue/MXKeyValue.kt | 27 +++++++++++++------ .../java/com/mx/keyvalue/crypt/KVAESCrypt.kt | 2 +- .../java/com/mx/keyvalue/store/IKVStore.kt | 4 +-- .../mx/keyvalue/store/sqlite/KVSqliteStore.kt | 4 +-- .../java/com/mx/keyvalue/utils/KVUtils.kt | 2 +- .../com/mx/example/app/ExpireTestActivity.kt | 5 ++-- .../main/java/com/mx/example/utils/SPUtils.kt | 9 ++++--- build.gradle | 2 +- 8 files changed, 34 insertions(+), 21 deletions(-) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt index 77272aa..ef7d039 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt @@ -9,15 +9,17 @@ import com.mx.keyvalue.utils.KVUtils import com.mx.keyvalue.utils.KeyFilter import com.mx.keyvalue.utils.MXPosition import kotlin.concurrent.thread +import kotlin.time.Duration +import kotlin.time.DurationUnit -class MXKeyValue private constructor(private val context: Context, private val store: IKVStore) { +class MXKeyValue private constructor(private val store: IKVStore) { companion object { fun setDebug(debug: Boolean) { KVUtils.setDebug(debug) } } - class Builder(private val context: Context, private val name: String) { + class Builder(private val name: String) { private var crypt: IKVCrypt? = null private var store: IKVStore? = null @@ -38,7 +40,7 @@ class MXKeyValue private constructor(private val context: Context, private val s } @Throws(exceptionClasses = [Exception::class]) - fun build(): MXKeyValue { + fun build(context: Context): MXKeyValue { val crypt = crypt ?: KVNoCrypt() if (!KVUtils.validate(crypt)) {// 验证crypt 工具类解密正确性 throw Exception("${crypt::class.java.simpleName} ---> IMXSecret Class validate error.") @@ -47,7 +49,7 @@ class MXKeyValue private constructor(private val context: Context, private val s val store = store ?: KVSqliteStore() store.create(context, name, crypt) - return MXKeyValue(context, store) + return MXKeyValue(store) } } @@ -58,24 +60,33 @@ class MXKeyValue private constructor(private val context: Context, private val s /** * 从SharedPreferences拷贝数据 */ - fun cloneFromSharedPreferences(name: String) { + fun cloneFromSharedPreferences(context: Context, name: String) { val sp = context.getSharedPreferences(name, Context.MODE_PRIVATE) for (entry in sp.all) { val value = entry.value?.toString() if (value != null) { - store.set(entry.key, value, null) + store.set(entry.key, value, 0) } } } /** * 设置KV + * @param key 键 + * @param value 值 + * @param duration 该值的有效期 */ - fun set(key: String, value: String?, expire_time: Long? = null): Boolean { + fun set(key: String, value: String?, duration: Duration? = null): Boolean { val key_trim = key.trim() if (key_trim.isBlank()) return false + + val ms = duration?.toLong(DurationUnit.MILLISECONDS) ?: 0 + val time = if (ms <= 0) 0 else { + System.currentTimeMillis() + ms + } + val result = if (!value.isNullOrEmpty()) { - store.set(key_trim, value, expire_time) + store.set(key_trim, value, time) } else { store.delete(key_trim) } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt index fc8606b..feb3646 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt @@ -2,7 +2,7 @@ package com.mx.keyvalue.crypt import android.util.Base64 import com.mx.keyvalue.utils.KVUtils -import java.util.* +import java.util.UUID import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt index f8e1e6e..6589d6f 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt @@ -22,9 +22,9 @@ interface IKVStore { * 设置Value * @param key 键 * @param value 值 - * @param dead_time 过期时间,超过这个时间后读取Key会返回 NULL + * @param dead_time 过期时间,超过这个时间后读取Key会返回 NULL,传值0或null不会检测这个值 */ - fun set(key: String, value: String, dead_time: Long?): Boolean + fun set(key: String, value: String, dead_time: Long): Boolean /** * 删除键值对 diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt index ccad14d..8426713 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt @@ -82,7 +82,7 @@ class KVSqliteStore : IKVStore { return null } - override fun set(key: String, value: String, dead_time: Long?): Boolean { + override fun set(key: String, value: String, dead_time: Long): Boolean { lock.write { val database = getDatabase() try { @@ -95,7 +95,7 @@ class KVSqliteStore : IKVStore { values.put(KVSQLiteHelper.DB_KEY_VALUE, value_encrypt) values.put(KVSQLiteHelper.DB_KEY_SALT, salt) values.put(KVSQLiteHelper.DB_KEY_UPDATE_TIME, System.currentTimeMillis()) - values.put(KVSQLiteHelper.DB_KEY_DEAD_TIME, dead_time ?: 0L) + values.put(KVSQLiteHelper.DB_KEY_DEAD_TIME, dead_time) val result = database.replace(name, null, values) >= 0 database.setTransactionSuccessful() return result diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt index fb96a8e..3a8ed42 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt @@ -2,7 +2,7 @@ package com.mx.keyvalue.utils import com.mx.keyvalue.crypt.IKVCrypt import java.security.MessageDigest -import java.util.* +import java.util.UUID internal object KVUtils { private var debug = false diff --git a/app/src/main/java/com/mx/example/app/ExpireTestActivity.kt b/app/src/main/java/com/mx/example/app/ExpireTestActivity.kt index 0ebf50d..a86aa3f 100644 --- a/app/src/main/java/com/mx/example/app/ExpireTestActivity.kt +++ b/app/src/main/java/com/mx/example/app/ExpireTestActivity.kt @@ -5,7 +5,8 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.mx.example.databinding.ActivityExpireTestBinding import com.mx.example.utils.SPUtils -import java.util.concurrent.TimeUnit +import kotlin.time.DurationUnit +import kotlin.time.toDuration class ExpireTestActivity : AppCompatActivity() { private val binding by lazy { ActivityExpireTestBinding.inflate(layoutInflater) } @@ -18,7 +19,7 @@ class ExpireTestActivity : AppCompatActivity() { SPUtils.set( "test_expire_key", "1分钟失效:" + System.currentTimeMillis(), - System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(1) + 1.toDuration(DurationUnit.MINUTES) ) Toast.makeText(this, SPUtils.get("test_expire_key", "失效"), Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/mx/example/utils/SPUtils.kt b/app/src/main/java/com/mx/example/utils/SPUtils.kt index 3233034..e40ba6d 100644 --- a/app/src/main/java/com/mx/example/utils/SPUtils.kt +++ b/app/src/main/java/com/mx/example/utils/SPUtils.kt @@ -8,22 +8,23 @@ import com.mx.keyvalue.crypt.KVAESCrypt import com.mx.keyvalue.delegate.KVBaseDelegate import com.mx.keyvalue.store.sqlite.KVSqliteStore import com.mx.keyvalue.utils.MXPosition +import kotlin.time.Duration // 缓存类 object SPUtils { val KV by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { - MXKeyValue.Builder(MyApp.appContext, "kvdb_kv_v1") + MXKeyValue.Builder("kvdb_kv_v1") .setCrypt(KVAESCrypt("27e2125d0a11a9aa65b9c9773673bc2a")) .setStore(KVSqliteStore()) - .build() + .build(MyApp.appContext) } fun get(key: String, def: String? = null): String? { return KV.get(key, def) } - fun set(key: String, value: String?, expire_time: Long? = null): Boolean { - return KV.set(key, value, expire_time) + fun set(key: String, value: String?, duration: Duration? = null): Boolean { + return KV.set(key, value, duration) } fun cleanAll() { diff --git a/build.gradle b/build.gradle index 6df93f5..150e58f 100644 --- a/build.gradle +++ b/build.gradle @@ -16,5 +16,5 @@ ext { minSdkVersion = 21 versionCode = 1 - versionName = "1.3.0" + versionName = "1.3.1" } \ No newline at end of file -- Gitee From ace251b80e5eae8348834318c2470a654489d4c9 Mon Sep 17 00:00:00 2001 From: zmx Date: Tue, 26 Mar 2024 13:21:11 +0800 Subject: [PATCH 2/2] Update MXKeyValue.kt --- LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt index ef7d039..fca841e 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt @@ -64,7 +64,7 @@ class MXKeyValue private constructor(private val store: IKVStore) { val sp = context.getSharedPreferences(name, Context.MODE_PRIVATE) for (entry in sp.all) { val value = entry.value?.toString() - if (value != null) { + if (!value.isNullOrBlank()) { store.set(entry.key, value, 0) } } -- Gitee