diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt index 77272aa9f9515c394f77c8313c142dcbde2dcfa2..fca841e15c005bdd1065c7adfa57bace3b7f1540 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) + if (!value.isNullOrBlank()) { + 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 fc8606b3096829a6fc31dac7be9d00be6707d1ce..feb3646a84f5fe84344db1472d5fc2e78f34dffc 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 f8e1e6e2a598f59d8b3dc0ab7e56ceb14aabdeeb..6589d6fb107f462e553107f49a6f13cbdd1ba90c 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 ccad14d84b03d07608f3fcea9f3604bca269e95f..84267131953945f7085f36262ab5032f1b73c925 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 fb96a8ef84d1939295685ec747063c5148dc9730..3a8ed422e8302a0cccd35b3608211e3868557ac6 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 0ebf50dce94a00003c52ebc4e3a4053f8e40ef98..a86aa3fb3f1fe6ae3f6d78b55c77480af9f1e561 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 32330343e533db2ac23ee311b311ceff2617f4bd..e40ba6d6aecdc939d3a4b87221774590c5ed930d 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 6df93f5a1f4229d0892b0fccbf8ded23e9aef53b..150e58fd0d2028a4c21d90946ebdac5cfe99d79c 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