From 13c989080c0cfce44bc9c6df6f0345e8c41d7d13 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Tue, 28 Jun 2022 09:54:21 +0800 Subject: [PATCH 1/5] 66 --- .../main/java/com/mx/keyvalue/MXKeyValue.kt | 80 ++++++++++-------- .../{secret/IMXCrypt.kt => crypt/IKVCrypt.kt} | 24 +----- .../MXAESCrypt.kt => crypt/KVAESCrypt.kt} | 12 +-- .../MXNoCrypt.kt => crypt/KVNoCrypt.kt} | 4 +- .../java/com/mx/keyvalue/store/IKVStore.kt | 5 +- .../{MXSQLiteHelper.kt => KVSQLiteHelper.kt} | 4 +- .../{MXSqliteStore.kt => KVSqliteStore.kt} | 82 ++++++++++--------- .../{MXKVObservable.kt => KVObservable.kt} | 8 +- .../utils/{MXKVObserver.kt => KVObserver.kt} | 2 +- .../keyvalue/utils/{MXUtils.kt => KVUtils.kt} | 19 ++++- .../main/java/com/mx/example/utils/MyCrypt.kt | 4 +- .../main/java/com/mx/example/utils/SPUtils.kt | 7 +- 12 files changed, 136 insertions(+), 115 deletions(-) rename LibKeyValue/src/main/java/com/mx/keyvalue/{secret/IMXCrypt.kt => crypt/IKVCrypt.kt} (34%) rename LibKeyValue/src/main/java/com/mx/keyvalue/{secret/MXAESCrypt.kt => crypt/KVAESCrypt.kt} (93%) rename LibKeyValue/src/main/java/com/mx/keyvalue/{secret/MXNoCrypt.kt => crypt/KVNoCrypt.kt} (82%) rename LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/{MXSQLiteHelper.kt => KVSQLiteHelper.kt} (88%) rename LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/{MXSqliteStore.kt => KVSqliteStore.kt} (71%) rename LibKeyValue/src/main/java/com/mx/keyvalue/utils/{MXKVObservable.kt => KVObservable.kt} (84%) rename LibKeyValue/src/main/java/com/mx/keyvalue/utils/{MXKVObserver.kt => KVObserver.kt} (75%) rename LibKeyValue/src/main/java/com/mx/keyvalue/utils/{MXUtils.kt => KVUtils.kt} (52%) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt index d137814..a0a7b93 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt @@ -1,37 +1,51 @@ package com.mx.keyvalue import android.content.Context -import com.mx.keyvalue.secret.IMXCrypt -import com.mx.keyvalue.secret.MXNoCrypt +import com.mx.keyvalue.crypt.IKVCrypt +import com.mx.keyvalue.crypt.KVNoCrypt import com.mx.keyvalue.store.IKVStore -import com.mx.keyvalue.store.sqlite.MXSqliteStore -import com.mx.keyvalue.utils.MXKVObservable -import com.mx.keyvalue.utils.MXKVObserver -import com.mx.keyvalue.utils.MXUtils - -class MXKeyValue( - private val context: Context, - private val name: String, - private val crypt: IMXCrypt = MXNoCrypt() -) { +import com.mx.keyvalue.store.sqlite.KVSqliteStore +import com.mx.keyvalue.utils.KVObservable +import com.mx.keyvalue.utils.KVObserver +import com.mx.keyvalue.utils.KVUtils + +class MXKeyValue private constructor(private val context: Context, private val store: IKVStore) { companion object { fun setDebug(debug: Boolean) { - MXUtils.setDebug(debug) + KVUtils.setDebug(debug) } } - private val observerSet = HashMap() - private val ikvStore: IKVStore by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { - MXSqliteStore(context.applicationContext, name.trim(), crypt) - } + class MXKVBuilder(private val context: Context, val name: String) { + private var crypt: IKVCrypt? = null + private var store: IKVStore? = null + + fun setCrypt(crypt: IKVCrypt): MXKVBuilder { + this.crypt = crypt + return this + } + + fun setStore(store: IKVStore): MXKVBuilder { + this.store = store + return this + } + + @Throws(exceptionClasses = [Exception::class]) + fun build(): MXKeyValue { + val crypt = crypt ?: KVNoCrypt() + if (!KVUtils.validate(crypt)) {// 验证crypt 工具类解密正确性 + throw Exception("${crypt::class.java.simpleName} ---> IMXSecret Class validate error.") + } - init { - if (!crypt.validate()) { - // 验证Secret 工具类解密正确性 - throw Exception("${crypt::class.java.simpleName} ---> IMXSecret Class validate error.") + val store = store ?: KVSqliteStore(context, name) + store.setCrypt(crypt) + + return MXKeyValue(context, store) } } + private val observerSet = HashMap() + /** * 从SharedPreferences拷贝数据 */ @@ -40,7 +54,7 @@ class MXKeyValue( for (entry in sp.all) { val value = entry.value?.toString() if (value != null) { - ikvStore.set(entry.key, value, null) + store.set(entry.key, value, null) } } } @@ -52,9 +66,9 @@ class MXKeyValue( val key_trim = key.trim() if (key_trim.isBlank()) return false val result = if (value != null && value.isNotEmpty()) { - ikvStore.set(key_trim, value, expire_time) + store.set(key_trim, value, expire_time) } else { - ikvStore.delete(key_trim) + store.delete(key_trim) } observerSet[key]?.set(value) return result @@ -66,7 +80,7 @@ class MXKeyValue( fun get(key: String, default: String? = null): String? { val key_trim = key.trim() if (key_trim.isBlank()) return default - return ikvStore.get(key_trim) ?: default + return store.get(key_trim) ?: default } /** @@ -75,45 +89,45 @@ class MXKeyValue( fun delete(key: String): Boolean { val key_trim = key.trim() if (key_trim.isBlank()) return false - val result = ikvStore.delete(key_trim) + val result = store.delete(key_trim) observerSet[key]?.set(null) return result } fun getAll(): Map { - return ikvStore.getAll() + return store.getAll() } /** * 清理过期KV */ fun cleanExpire() { - ikvStore.cleanExpire() + store.cleanExpire() } /** * 清理数据 */ fun cleanAll(): Boolean { - return ikvStore.cleanAll() + return store.cleanAll() } - fun addKeyObserver(key: String, observer: MXKVObserver) { + fun addKeyObserver(key: String, observer: KVObserver) { var observable = observerSet[key] if (observable == null) { - observable = MXKVObservable(key, get(key)) + observable = KVObservable(key, get(key)) observerSet[key] = observable } observable.addObserver(observer) } - fun removeKeyObserver(key: String, observer: MXKVObserver) { + fun removeKeyObserver(key: String, observer: KVObserver) { val observable = observerSet[key] ?: return observable.deleteObserver(observer) } fun release() { observerSet.clear() - ikvStore.release() + store.release() } } \ No newline at end of file diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/secret/IMXCrypt.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt similarity index 34% rename from LibKeyValue/src/main/java/com/mx/keyvalue/secret/IMXCrypt.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt index 9366131..09a69ba 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/secret/IMXCrypt.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt @@ -1,9 +1,9 @@ -package com.mx.keyvalue.secret +package com.mx.keyvalue.crypt -import com.mx.keyvalue.utils.MXUtils +import com.mx.keyvalue.utils.KVUtils import java.util.* -interface IMXCrypt { +interface IKVCrypt { /** * 生成随机密码 */ @@ -20,22 +20,4 @@ interface IMXCrypt { * @param key 对应的Key */ fun decrypt(key: String, secretValue: String, salt: String): String? - - /** - * 验证当前加密类的正确性 - */ - fun validate(): Boolean { - try { - val key = UUID.randomUUID().toString().replace("-", "") - val value = UUID.randomUUID().toString().replace("-", "") + System.currentTimeMillis() - val salt = generalSalt() - val secretKey = encrypt(key, value, salt)!! - val desValue = decrypt(key, secretKey, salt) - MXUtils.log("IMXSecret validate => $value --- $desValue") - return value == desValue - } catch (e: Exception) { - e.printStackTrace() - } - return false - } } \ No newline at end of file diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/secret/MXAESCrypt.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt similarity index 93% rename from LibKeyValue/src/main/java/com/mx/keyvalue/secret/MXAESCrypt.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt index e18ba5e..fc8606b 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/secret/MXAESCrypt.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVAESCrypt.kt @@ -1,7 +1,7 @@ -package com.mx.keyvalue.secret +package com.mx.keyvalue.crypt import android.util.Base64 -import com.mx.keyvalue.utils.MXUtils +import com.mx.keyvalue.utils.KVUtils import java.util.* import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec @@ -12,7 +12,7 @@ import kotlin.random.Random * AES对称加密 * @param key 加密用的Key */ -open class MXAESCrypt(private val key: String) : IMXCrypt { +open class KVAESCrypt(private val key: String) : IKVCrypt { companion object { private val salt_key = arrayOf( 65, 110, 123, 56, 3, 115, 73, 29, 108, 117, 98, 47, 93, 10, 71, @@ -54,7 +54,7 @@ open class MXAESCrypt(private val key: String) : IMXCrypt { keys.append(source[i % source.size]) } keys.append(list) - return MXUtils.md5(keys.toString().toByteArray(), 16).toByteArray() + return KVUtils.md5(keys.toString().toByteArray(), 16).toByteArray() } private fun generalMixIv(): ByteArray { @@ -67,7 +67,7 @@ open class MXAESCrypt(private val key: String) : IMXCrypt { keys.append(source[i % source.size]) } keys.append(list) - return MXUtils.md5(keys.toString().toByteArray(), 16).toByteArray() + return KVUtils.md5(keys.toString().toByteArray(), 16).toByteArray() } private val keySpec = SecretKeySpec(generalMixKey(), "AES") @@ -82,7 +82,7 @@ open class MXAESCrypt(private val key: String) : IMXCrypt { } override fun generalSalt(): String { - val length = Random.nextInt(15, 30) + val length = Random.nextInt(25, 30) return UUID.randomUUID().toString().replace("-", "").substring(0, length) } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/secret/MXNoCrypt.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVNoCrypt.kt similarity index 82% rename from LibKeyValue/src/main/java/com/mx/keyvalue/secret/MXNoCrypt.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVNoCrypt.kt index a597a3a..86044dc 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/secret/MXNoCrypt.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/KVNoCrypt.kt @@ -1,9 +1,9 @@ -package com.mx.keyvalue.secret +package com.mx.keyvalue.crypt /** * 不加密 */ -open class MXNoCrypt : IMXCrypt { +open class KVNoCrypt : IKVCrypt { override fun generalSalt(): String { return "" } 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 09d4a8b..3e9ac82 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt @@ -1,6 +1,9 @@ package com.mx.keyvalue.store -internal interface IKVStore { +import com.mx.keyvalue.crypt.IKVCrypt + +interface IKVStore { + fun setCrypt(crypt: IKVCrypt) fun get(key: String): String? fun set(key: String, value: String, dead_time: Long?): Boolean fun delete(key: String): Boolean diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/MXSQLiteHelper.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSQLiteHelper.kt similarity index 88% rename from LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/MXSQLiteHelper.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSQLiteHelper.kt index 0cd2486..6093585 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/MXSQLiteHelper.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSQLiteHelper.kt @@ -4,8 +4,8 @@ import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper -internal class MXSQLiteHelper(context: Context, dbName: String) : - SQLiteOpenHelper(context, dbName, null, 4) { +internal class KVSQLiteHelper(context: Context, dbName: String) : + SQLiteOpenHelper(context.applicationContext, dbName, null, 4) { companion object { const val DB_KEY_NAME = "kv_name" const val DB_KEY_VALUE = "kv_value" diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/MXSqliteStore.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt similarity index 71% rename from LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/MXSqliteStore.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt index 76874e5..56ff127 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/MXSqliteStore.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt @@ -5,46 +5,48 @@ import android.content.Context import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper -import com.mx.keyvalue.secret.IMXCrypt +import com.mx.keyvalue.crypt.IKVCrypt +import com.mx.keyvalue.crypt.KVNoCrypt import com.mx.keyvalue.store.IKVStore -import com.mx.keyvalue.utils.MXUtils +import com.mx.keyvalue.utils.KVUtils import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.read import kotlin.concurrent.write -internal class MXSqliteStore( - private val context: Context, - private val dbName: String, - private val crypt: IMXCrypt -) : IKVStore { +class KVSqliteStore(private val context: Context, private val name: String) : IKVStore { private val lock = ReentrantReadWriteLock(true) + private var crypt: IKVCrypt = KVNoCrypt() private var sqliteHelper: SQLiteOpenHelper? = null private fun getDatabase(): SQLiteDatabase { if (sqliteHelper == null) { synchronized(this) { if (sqliteHelper == null) { - sqliteHelper = MXSQLiteHelper(context, dbName) + sqliteHelper = KVSQLiteHelper(context, name) } } } return sqliteHelper!!.writableDatabase } + override fun setCrypt(crypt: IKVCrypt) { + this.crypt = crypt + } + override fun get(key: String): String? { lock.read { var cursor: Cursor? = null try { val database = getDatabase() cursor = database.query( - dbName, + name, arrayOf( - MXSQLiteHelper.DB_KEY_NAME, - MXSQLiteHelper.DB_KEY_VALUE, - MXSQLiteHelper.DB_KEY_SALT, - MXSQLiteHelper.DB_KEY_DEAD_TIME + KVSQLiteHelper.DB_KEY_NAME, + KVSQLiteHelper.DB_KEY_VALUE, + KVSQLiteHelper.DB_KEY_SALT, + KVSQLiteHelper.DB_KEY_DEAD_TIME ), - "${MXSQLiteHelper.DB_KEY_NAME}=?", + "${KVSQLiteHelper.DB_KEY_NAME}=?", arrayOf(key), null, null, @@ -58,7 +60,7 @@ internal class MXSqliteStore( } } catch (e: Exception) { e.printStackTrace() - MXUtils.log("get错误 -> $key -- ${e.message}") + KVUtils.log("get错误 -> $key -- ${e.message}") } finally { try { cursor?.close() @@ -78,17 +80,17 @@ internal class MXSqliteStore( val value_encrypt = crypt.encrypt(key, value, salt) val values = ContentValues() - values.put(MXSQLiteHelper.DB_KEY_NAME, key) - values.put(MXSQLiteHelper.DB_KEY_VALUE, value_encrypt) - values.put(MXSQLiteHelper.DB_KEY_SALT, salt) - values.put(MXSQLiteHelper.DB_KEY_UPDATE_TIME, System.currentTimeMillis()) - values.put(MXSQLiteHelper.DB_KEY_DEAD_TIME, dead_time ?: 0L) - val result = database.replace(dbName, null, values) >= 0 + values.put(KVSQLiteHelper.DB_KEY_NAME, key) + 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) + val result = database.replace(name, null, values) >= 0 database.setTransactionSuccessful() return result } catch (e: Exception) { e.printStackTrace() - MXUtils.log("set错误 -> $key = $value ; $dead_time -- ${e.message}") + KVUtils.log("set错误 -> $key = $value ; $dead_time -- ${e.message}") } finally { database.endTransaction() } @@ -102,15 +104,15 @@ internal class MXSqliteStore( try { database.beginTransaction() val result = database.delete( - dbName, - "${MXSQLiteHelper.DB_KEY_NAME}=?", + name, + "${KVSQLiteHelper.DB_KEY_NAME}=?", arrayOf(key) ) > 0 database.setTransactionSuccessful() return result } catch (e: Exception) { e.printStackTrace() - MXUtils.log("delete错误 -> $key -- ${e.message}") + KVUtils.log("delete错误 -> $key -- ${e.message}") } finally { database.endTransaction() } @@ -125,12 +127,12 @@ internal class MXSqliteStore( var cursor: Cursor? = null try { cursor = database.query( - dbName, + name, arrayOf( - MXSQLiteHelper.DB_KEY_NAME, - MXSQLiteHelper.DB_KEY_VALUE, - MXSQLiteHelper.DB_KEY_SALT, - MXSQLiteHelper.DB_KEY_DEAD_TIME + KVSQLiteHelper.DB_KEY_NAME, + KVSQLiteHelper.DB_KEY_VALUE, + KVSQLiteHelper.DB_KEY_SALT, + KVSQLiteHelper.DB_KEY_DEAD_TIME ), null, null, null, null, null ) while (cursor.moveToNext()) { @@ -141,7 +143,7 @@ internal class MXSqliteStore( } } catch (e: Exception) { e.printStackTrace() - MXUtils.log("getAll错误 -> ${e.message}") + KVUtils.log("getAll错误 -> ${e.message}") } finally { try { cursor?.close() @@ -158,15 +160,15 @@ internal class MXSqliteStore( try { database.beginTransaction() val result = database.delete( - dbName, - "${MXSQLiteHelper.DB_KEY_DEAD_TIME}>0 and ${MXSQLiteHelper.DB_KEY_DEAD_TIME}0 and ${KVSQLiteHelper.DB_KEY_DEAD_TIME} 0 database.setTransactionSuccessful() return result } catch (e: Exception) { e.printStackTrace() - MXUtils.log("cleanExpire错误 -> ${e.message}") + KVUtils.log("cleanExpire错误 -> ${e.message}") } finally { database.endTransaction() } @@ -179,12 +181,12 @@ internal class MXSqliteStore( val database = getDatabase() try { database.beginTransaction() - val result = database.delete(dbName, null, null) > 0 + val result = database.delete(name, null, null) > 0 database.setTransactionSuccessful() return result } catch (e: Exception) { e.printStackTrace() - MXUtils.log("cleanAll错误 -> ${e.message}") + KVUtils.log("cleanAll错误 -> ${e.message}") } finally { database.endTransaction() } @@ -195,16 +197,16 @@ internal class MXSqliteStore( private fun cursorToEntry(cursor: Cursor): Pair? { try { val key = cursor.getString( - cursor.getColumnIndexOrThrow(MXSQLiteHelper.DB_KEY_NAME) + cursor.getColumnIndexOrThrow(KVSQLiteHelper.DB_KEY_NAME) ) var value = cursor.getString( - cursor.getColumnIndexOrThrow(MXSQLiteHelper.DB_KEY_VALUE) + cursor.getColumnIndexOrThrow(KVSQLiteHelper.DB_KEY_VALUE) ) val salt = cursor.getString( - cursor.getColumnIndexOrThrow(MXSQLiteHelper.DB_KEY_SALT) + cursor.getColumnIndexOrThrow(KVSQLiteHelper.DB_KEY_SALT) ) val dead_time = cursor.getLong( - cursor.getColumnIndexOrThrow(MXSQLiteHelper.DB_KEY_DEAD_TIME) + cursor.getColumnIndexOrThrow(KVSQLiteHelper.DB_KEY_DEAD_TIME) ) if (dead_time > 0 && dead_time < System.currentTimeMillis()) { return null diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXKVObservable.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVObservable.kt similarity index 84% rename from LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXKVObservable.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVObservable.kt index 8f339a5..faadff8 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXKVObservable.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVObservable.kt @@ -3,10 +3,10 @@ package com.mx.keyvalue.utils import android.os.Handler import android.os.Looper -internal class MXKVObservable(val key: String, defaultValue: String?) { +internal class KVObservable(val key: String, defaultValue: String?) { private val mHandler = Handler(Looper.getMainLooper()) private val lock = Object() - private val observerList = HashSet() + private val observerList = HashSet() private var _value: String? = defaultValue @@ -30,7 +30,7 @@ internal class MXKVObservable(val key: String, defaultValue: String?) { fun get() = _value - fun addObserver(o: MXKVObserver?) { + fun addObserver(o: KVObserver?) { o ?: return synchronized(lock) { observerList.add(o) @@ -38,7 +38,7 @@ internal class MXKVObservable(val key: String, defaultValue: String?) { mHandler.post { o.onChange(key, _value) } } - fun deleteObserver(o: MXKVObserver?) { + fun deleteObserver(o: KVObserver?) { o ?: return synchronized(lock) { observerList.remove(o) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXKVObserver.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVObserver.kt similarity index 75% rename from LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXKVObserver.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVObserver.kt index 55936e8..392c5bf 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXKVObserver.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVObserver.kt @@ -1,5 +1,5 @@ package com.mx.keyvalue.utils -interface MXKVObserver { +interface KVObserver { fun onChange(key: String, value: String?) } \ No newline at end of file diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXUtils.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt similarity index 52% rename from LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXUtils.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt index b838d51..5c54106 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/utils/MXUtils.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/utils/KVUtils.kt @@ -1,9 +1,11 @@ package com.mx.keyvalue.utils import com.mx.keyvalue.BuildConfig +import com.mx.keyvalue.crypt.IKVCrypt import java.security.MessageDigest +import java.util.* -internal object MXUtils { +internal object KVUtils { private var debug = BuildConfig.DEBUG fun setDebug(debug: Boolean) { this.debug = debug @@ -27,4 +29,19 @@ internal object MXUtils { } return builder.toString().substring(0, size).lowercase() } + + fun validate(crypt: IKVCrypt): Boolean { + try { + val key = UUID.randomUUID().toString().replace("-", "") + val value = UUID.randomUUID().toString().replace("-", "") + System.currentTimeMillis() + val salt = crypt.generalSalt() + val secretKey = crypt.encrypt(key, value, salt)!! + val desValue = crypt.decrypt(key, secretKey, salt) + log("IMXSecret validate => $value --- $desValue") + return value == desValue + } catch (e: Exception) { + e.printStackTrace() + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/mx/example/utils/MyCrypt.kt b/app/src/main/java/com/mx/example/utils/MyCrypt.kt index 2a8789c..1c866f4 100644 --- a/app/src/main/java/com/mx/example/utils/MyCrypt.kt +++ b/app/src/main/java/com/mx/example/utils/MyCrypt.kt @@ -1,9 +1,9 @@ package com.mx.example.utils -import com.mx.keyvalue.secret.IMXCrypt +import com.mx.keyvalue.crypt.IKVCrypt import java.util.* -class MyCrypt : IMXCrypt { +class MyCrypt : IKVCrypt { private val divider = "$$$$$$$$$$$$" override fun generalSalt(): String { return UUID.randomUUID().toString().replace("-", "") 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 5d03926..d1d38c0 100644 --- a/app/src/main/java/com/mx/example/utils/SPUtils.kt +++ b/app/src/main/java/com/mx/example/utils/SPUtils.kt @@ -5,13 +5,16 @@ import com.fasterxml.jackson.module.kotlin.registerKotlinModule import com.mx.example.MyApp import com.mx.keyvalue.MXKeyValue import com.mx.keyvalue.delegate.MXBaseDelegate -import com.mx.keyvalue.secret.MXAESCrypt +import com.mx.keyvalue.crypt.KVAESCrypt // 缓存类 object SPUtils { val KV by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { - MXKeyValue(MyApp.appContext, "kvdb_kv_v1", MXAESCrypt("27e2125d0a11a9aa65b9c9773673bc2a")) + MXKeyValue.MXKVBuilder(MyApp.appContext, "kvdb_kv_v1") + .setCrypt(KVAESCrypt("27e2125d0a11a9aa65b9c9773673bc2a")) + .build() } + fun get(key: String, def: String? = null): String? { return KV.get(key, def) } -- Gitee From 3d21a53946fc454e5fd40185404d0fa3c483d288 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Tue, 28 Jun 2022 09:56:26 +0800 Subject: [PATCH 2/5] Update IKVCrypt.kt --- LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt index 09a69ba..84111bf 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/crypt/IKVCrypt.kt @@ -1,8 +1,5 @@ package com.mx.keyvalue.crypt -import com.mx.keyvalue.utils.KVUtils -import java.util.* - interface IKVCrypt { /** * 生成随机密码 -- Gitee From 7ae945656e762677df780cc98a725b1103790801 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Tue, 28 Jun 2022 10:13:58 +0800 Subject: [PATCH 3/5] 666 --- .../main/java/com/mx/keyvalue/MXKeyValue.kt | 8 ++-- .../java/com/mx/keyvalue/store/IKVStore.kt | 38 ++++++++++++++++++- .../mx/keyvalue/store/sqlite/KVSqliteStore.kt | 13 +++++-- README.md | 34 ++++++++--------- .../main/java/com/mx/example/utils/SPUtils.kt | 6 ++- 5 files changed, 71 insertions(+), 28 deletions(-) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt index a0a7b93..cd4451d 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/MXKeyValue.kt @@ -16,7 +16,7 @@ class MXKeyValue private constructor(private val context: Context, private val s } } - class MXKVBuilder(private val context: Context, val name: String) { + class MXKVBuilder { private var crypt: IKVCrypt? = null private var store: IKVStore? = null @@ -31,14 +31,14 @@ class MXKeyValue private constructor(private val context: Context, private val s } @Throws(exceptionClasses = [Exception::class]) - fun build(): MXKeyValue { + fun build(context: Context, name: String): MXKeyValue { val crypt = crypt ?: KVNoCrypt() if (!KVUtils.validate(crypt)) {// 验证crypt 工具类解密正确性 throw Exception("${crypt::class.java.simpleName} ---> IMXSecret Class validate error.") } - val store = store ?: KVSqliteStore(context, name) - store.setCrypt(crypt) + val store = store ?: KVSqliteStore() + store.create(context, name, crypt) return MXKeyValue(context, store) } 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 3e9ac82..35d4289 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/store/IKVStore.kt @@ -1,17 +1,53 @@ package com.mx.keyvalue.store +import android.content.Context import com.mx.keyvalue.crypt.IKVCrypt interface IKVStore { - fun setCrypt(crypt: IKVCrypt) + /** + * 初始化 + * @param context 上下文,一般需要传入applicationContext + * @param name 存储库名字 + * @param crypt 加密方式 + */ + fun create(context: Context, name: String, crypt: IKVCrypt) + + /** + * 获取Value + */ fun get(key: String): String? + + /** + * 设置Value + * @param key 键 + * @param value 值 + * @param dead_time 过期时间,超过这个时间后读取Key会返回 NULL + */ fun set(key: String, value: String, dead_time: Long?): Boolean + + /** + * 删除键值对 + * @param key 键 + */ fun delete(key: String): Boolean + /** + * 获取所有键值对 + */ fun getAll(): Map + /** + * 清理所有超时的键值对 + */ fun cleanExpire(): Boolean + + /** + * 删除所有数据 + */ fun cleanAll(): Boolean + /** + * 释放资源 + */ fun release() } \ No newline at end of file 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 56ff127..8aebad6 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 @@ -13,8 +13,13 @@ import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.concurrent.read import kotlin.concurrent.write -class KVSqliteStore(private val context: Context, private val name: String) : IKVStore { +/** + * sqlite实现的存储 + */ +class KVSqliteStore : IKVStore { private val lock = ReentrantReadWriteLock(true) + private var context: Context? = null + private var name: String = "" private var crypt: IKVCrypt = KVNoCrypt() private var sqliteHelper: SQLiteOpenHelper? = null @@ -22,14 +27,16 @@ class KVSqliteStore(private val context: Context, private val name: String) : IK if (sqliteHelper == null) { synchronized(this) { if (sqliteHelper == null) { - sqliteHelper = KVSQLiteHelper(context, name) + sqliteHelper = KVSQLiteHelper(context!!, name) } } } return sqliteHelper!!.writableDatabase } - override fun setCrypt(crypt: IKVCrypt) { + override fun create(context: Context, name: String, crypt: IKVCrypt) { + this.context = context + this.name = name this.crypt = crypt } diff --git a/README.md b/README.md index 8623da2..449e76e 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,18 @@ ## 介绍 基于Sqlite的,支持加密、自定义加密方式的KV数据库 [![](https://jitpack.io/v/com.gitee.zhangmengxiong/MXKeyValue.svg)](https://jitpack.io/#com.gitee.zhangmengxiong/MXKeyValue) -库引用: 替换1.0.9 为最新版本 +库引用: 替换1.1.1 为最新版本 ```gradle - implementation 'com.gitee.zhangmengxiong:MXKeyValue:1.0.9' + implementation 'com.gitee.zhangmengxiong:MXKeyValue:1.1.1' ``` ## 使用方法 ```kotlin -val KV = MXKeyValue( - application, // context - name = "mx_kv_test", // 存储数据库名称 - secret = MXNoCrypt() // 加密方式 -) +val KV = MXKeyValue.MXKVBuilder() + .setCrypt(KVAESCrypt("27e2125d0a11a9aa65b9c9773673bc2a")) + .setStore(KVSqliteStore()) + .build(MyApp.appContext, "kvdb_kv_v1") // 清理所有KV KV.cleanAll() @@ -46,18 +45,18 @@ KV.cloneFromSharedPreferences("sp_name") ## 加密相关 MXKeyValue内置两种加密方式: -- MXNoCrypt() -- MXAESCrypt("加密字符") +- KVNoCrypt() +- KVAESCrypt("加密字符") ### MXNoSecret -MXNoCrypt = 不加密,存储Value=设置的Value +KVNoCrypt = 不加密,存储Value=设置的Value ### MXAESSecret -MXAESCrypt = AES对称加密 +KVAESCrypt = AES对称加密 - 存储的value=encrypt(设置的Value) - 读取的Value=decrypt(存储的Value) -注意:MXAESSecret初始化的加密字符在app上线后不能修改,否则会导致数据读取错误! +注意:KVAESCrypt初始化的加密字符在app上线后不能修改,否则会导致数据读取错误! ### 自定义加密方式 - 需要实现IMXCrypt接口 @@ -65,7 +64,7 @@ MXAESCrypt = AES对称加密 - encrypt方法 = 源数据Value->存储Value - decrypt方法 = 存储Value->源数据Value ```kotlin -class MyCrypt : IMXCrypt { +class MyCrypt : IKVCrypt { private val divider = "$$$$$$$$$$$$" override fun generalSalt(): String { return UUID.randomUUID().toString().replace("-", "") @@ -82,9 +81,8 @@ class MyCrypt : IMXCrypt { ``` 使用方法: ```kotlin -val KV = MXKeyValue( - application, - name = "mx_kv_test", - secret = MyCrypt() // 加密方式 -) +val KV = MXKeyValue.MXKVBuilder() + .setCrypt(MyCrypt()) + .setStore(KVSqliteStore()) + .build(MyApp.appContext, "kvdb_kv_v1") ``` \ No newline at end of file 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 d1d38c0..ce2509f 100644 --- a/app/src/main/java/com/mx/example/utils/SPUtils.kt +++ b/app/src/main/java/com/mx/example/utils/SPUtils.kt @@ -6,13 +6,15 @@ import com.mx.example.MyApp import com.mx.keyvalue.MXKeyValue import com.mx.keyvalue.delegate.MXBaseDelegate import com.mx.keyvalue.crypt.KVAESCrypt +import com.mx.keyvalue.store.sqlite.KVSqliteStore // 缓存类 object SPUtils { val KV by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { - MXKeyValue.MXKVBuilder(MyApp.appContext, "kvdb_kv_v1") + MXKeyValue.MXKVBuilder() .setCrypt(KVAESCrypt("27e2125d0a11a9aa65b9c9773673bc2a")) - .build() + .setStore(KVSqliteStore()) + .build(MyApp.appContext, "kvdb_kv_v1") } fun get(key: String, def: String? = null): String? { -- Gitee From 64f2b710347a803511cdcfbf8a39ddbacfd7cbc3 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Tue, 28 Jun 2022 10:17:03 +0800 Subject: [PATCH 4/5] 666 --- .../{MXBaseDelegate.kt => KVBaseDelegate.kt} | 8 ++++---- .../{MXBoolDelegate.kt => KVBoolDelegate.kt} | 4 ++-- ...MXDoubleDelegate.kt => KVDoubleDelegate.kt} | 4 ++-- .../{MXFloatDelegate.kt => KVFloatDelegate.kt} | 4 ++-- .../{MXIntDelegate.kt => KVIntDelegate.kt} | 4 ++-- .../{MXLongDelegate.kt => KVLongDelegate.kt} | 4 ++-- ...MXStringDelegate.kt => KVStringDelegate.kt} | 4 ++-- .../com/mx/example/app/DelegateTestActivity.kt | 18 +++++++++--------- .../java/com/mx/example/app/MainActivity.kt | 11 ----------- .../mx/example/app/MultThreadTestActivity.kt | 1 - .../main/java/com/mx/example/utils/SPUtils.kt | 6 +++--- .../java/com/mx/example/utils/StringUtils.kt | 1 - 12 files changed, 28 insertions(+), 41 deletions(-) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXBaseDelegate.kt => KVBaseDelegate.kt} (74%) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXBoolDelegate.kt => KVBoolDelegate.kt} (66%) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXDoubleDelegate.kt => KVDoubleDelegate.kt} (67%) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXFloatDelegate.kt => KVFloatDelegate.kt} (68%) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXIntDelegate.kt => KVIntDelegate.kt} (68%) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXLongDelegate.kt => KVLongDelegate.kt} (68%) rename LibKeyValue/src/main/java/com/mx/keyvalue/delegate/{MXStringDelegate.kt => KVStringDelegate.kt} (64%) diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXBaseDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVBaseDelegate.kt similarity index 74% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXBaseDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVBaseDelegate.kt index c0d96c3..ceaa3fc 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXBaseDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVBaseDelegate.kt @@ -3,18 +3,18 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue import kotlin.reflect.KProperty -abstract class MXBaseDelegate( +abstract class KVBaseDelegate( protected val kv: MXKeyValue, - protected val name: String, + protected val key: String, protected val default: T ) { operator fun getValue(thisRef: Any?, property: KProperty<*>): T { - val value = kv.get(name) ?: return default + val value = kv.get(key) ?: return default return stringToObject(value) } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { - kv.set(name, objectToString(value)) + kv.set(key, objectToString(value)) } abstract fun stringToObject(value: String): T diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXBoolDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVBoolDelegate.kt similarity index 66% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXBoolDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVBoolDelegate.kt index 12cc2e7..e167038 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXBoolDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVBoolDelegate.kt @@ -2,8 +2,8 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue -open class MXBoolDelegate(kv: MXKeyValue, name: String, default: Boolean = false) : - MXBaseDelegate(kv, name, default) { +open class KVBoolDelegate(kv: MXKeyValue, key: String, default: Boolean = false) : + KVBaseDelegate(kv, key, default) { override fun stringToObject(value: String): Boolean { return value.toBoolean() } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXDoubleDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVDoubleDelegate.kt similarity index 67% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXDoubleDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVDoubleDelegate.kt index f0d8592..9fcfaa4 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXDoubleDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVDoubleDelegate.kt @@ -2,8 +2,8 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue -open class MXDoubleDelegate(kv: MXKeyValue, name: String, default: Double = 0.0) : - MXBaseDelegate(kv, name, default) { +open class KVDoubleDelegate(kv: MXKeyValue, key: String, default: Double = 0.0) : + KVBaseDelegate(kv, key, default) { override fun stringToObject(value: String): Double { return value.toDoubleOrNull() ?: default } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXFloatDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVFloatDelegate.kt similarity index 68% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXFloatDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVFloatDelegate.kt index 07029b1..a4968c2 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXFloatDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVFloatDelegate.kt @@ -2,8 +2,8 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue -open class MXFloatDelegate(kv: MXKeyValue, name: String, default: Float = 0f) : - MXBaseDelegate(kv, name, default) { +open class KVFloatDelegate(kv: MXKeyValue, key: String, default: Float = 0f) : + KVBaseDelegate(kv, key, default) { override fun stringToObject(value: String): Float { return value.toFloatOrNull() ?: default } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXIntDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVIntDelegate.kt similarity index 68% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXIntDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVIntDelegate.kt index 017099a..14314c9 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXIntDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVIntDelegate.kt @@ -2,8 +2,8 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue -open class MXIntDelegate(kv: MXKeyValue, name: String, default: Int = 0) : - MXBaseDelegate(kv, name, default) { +open class KVIntDelegate(kv: MXKeyValue, key: String, default: Int = 0) : + KVBaseDelegate(kv, key, default) { override fun stringToObject(value: String): Int { return value.toIntOrNull() ?: default } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXLongDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVLongDelegate.kt similarity index 68% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXLongDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVLongDelegate.kt index d925662..484c836 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXLongDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVLongDelegate.kt @@ -2,8 +2,8 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue -open class MXLongDelegate(kv: MXKeyValue, name: String, default: Long = 0) : - MXBaseDelegate(kv, name, default) { +open class KVLongDelegate(kv: MXKeyValue, key: String, default: Long = 0) : + KVBaseDelegate(kv, key, default) { override fun stringToObject(value: String): Long { return value.toLongOrNull() ?: default } diff --git a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXStringDelegate.kt b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVStringDelegate.kt similarity index 64% rename from LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXStringDelegate.kt rename to LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVStringDelegate.kt index ce403c9..4ef240d 100644 --- a/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/MXStringDelegate.kt +++ b/LibKeyValue/src/main/java/com/mx/keyvalue/delegate/KVStringDelegate.kt @@ -2,8 +2,8 @@ package com.mx.keyvalue.delegate import com.mx.keyvalue.MXKeyValue -open class MXStringDelegate(kv: MXKeyValue, name: String, default: String = "") : - MXBaseDelegate(kv, name, default) { +open class KVStringDelegate(kv: MXKeyValue, key: String, default: String = "") : + KVBaseDelegate(kv, key, default) { override fun stringToObject(value: String): String { return value } diff --git a/app/src/main/java/com/mx/example/app/DelegateTestActivity.kt b/app/src/main/java/com/mx/example/app/DelegateTestActivity.kt index 006c537..07cfdf0 100644 --- a/app/src/main/java/com/mx/example/app/DelegateTestActivity.kt +++ b/app/src/main/java/com/mx/example/app/DelegateTestActivity.kt @@ -18,43 +18,43 @@ class DelegateTestActivity : AppCompatActivity() { setContentView(R.layout.activity_delegate_test) testBtn.setOnClickListener { - var boolDelegate by MXBoolDelegate(SPUtils.KV, "bool_test", true) + var boolDelegate by KVBoolDelegate(SPUtils.KV, "bool_test", true) println("测试 MXBoolDelegate -> $boolDelegate") boolDelegate = false println("测试 MXBoolDelegate -> $boolDelegate") - var doubleDelegate by MXDoubleDelegate(SPUtils.KV, "double_test", 1.0) + var doubleDelegate by KVDoubleDelegate(SPUtils.KV, "double_test", 1.0) println("测试 MXDoubleDelegate -> $doubleDelegate") doubleDelegate = 2.0 println("测试 MXDoubleDelegate -> $doubleDelegate") - var floatDelegate by MXFloatDelegate(SPUtils.KV, "float_test", 1f) + var floatDelegate by KVFloatDelegate(SPUtils.KV, "float_test", 1f) println("测试 MXFloatDelegate -> $floatDelegate") floatDelegate = 2f println("测试 MXFloatDelegate -> $floatDelegate") - var intDelegate by MXIntDelegate(SPUtils.KV, "int_test", 1) + var intDelegate by KVIntDelegate(SPUtils.KV, "int_test", 1) println("测试 MXIntDelegate -> $intDelegate") intDelegate = 2 println("测试 MXIntDelegate -> $intDelegate") - var longDelegate by MXLongDelegate(SPUtils.KV, "long_test", 1) + var longDelegate by KVLongDelegate(SPUtils.KV, "long_test", 1) println("测试 MXLongDelegate -> $longDelegate") longDelegate = 2 println("测试 MXLongDelegate -> $longDelegate") - var stringDelegate by MXStringDelegate(SPUtils.KV, "string_test", "testdef") + var stringDelegate by KVStringDelegate(SPUtils.KV, "string_test", "testdef") println("测试 MXStringDelegate -> $stringDelegate") stringDelegate = "2" println("测试 MXStringDelegate -> $stringDelegate") - var beanDelegate by MXBeanDelegate( + var beanDelegate by KVBeanDelegate( SPUtils.KV, TestBean::class.java, "bean_test", @@ -70,12 +70,12 @@ class DelegateTestActivity : AppCompatActivity() { @JsonIgnoreProperties(ignoreUnknown = true) data class TestBean constructor(val id: String, val name: String) - class MXBeanDelegate( + class KVBeanDelegate( kv: MXKeyValue, private val clazz: Class, name: String, default: T - ) : MXBaseDelegate(kv, name, default) { + ) : KVBaseDelegate(kv, name, default) { override fun stringToObject(value: String): T { try { val mapper = ObjectMapper() diff --git a/app/src/main/java/com/mx/example/app/MainActivity.kt b/app/src/main/java/com/mx/example/app/MainActivity.kt index 4c29fec..4ae376e 100644 --- a/app/src/main/java/com/mx/example/app/MainActivity.kt +++ b/app/src/main/java/com/mx/example/app/MainActivity.kt @@ -2,20 +2,9 @@ package com.mx.example.app import android.content.Intent import android.os.Bundle -import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import com.fasterxml.jackson.annotation.JsonIgnoreProperties -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.registerKotlinModule import com.mx.example.R -import com.mx.example.utils.SPUtils -import com.mx.keyvalue.MXKeyValue -import com.mx.keyvalue.delegate.* import kotlinx.android.synthetic.main.activity_main.* -import java.lang.StringBuilder -import java.util.concurrent.TimeUnit -import kotlin.concurrent.thread -import kotlin.random.Random class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/mx/example/app/MultThreadTestActivity.kt b/app/src/main/java/com/mx/example/app/MultThreadTestActivity.kt index 76cd369..965914b 100644 --- a/app/src/main/java/com/mx/example/app/MultThreadTestActivity.kt +++ b/app/src/main/java/com/mx/example/app/MultThreadTestActivity.kt @@ -4,7 +4,6 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.mx.example.R import com.mx.example.utils.SPUtils -import com.mx.example.utils.StringUtils import kotlinx.android.synthetic.main.activity_mult_thread_test.* import kotlin.concurrent.thread import kotlin.random.Random 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 ce2509f..ebe734b 100644 --- a/app/src/main/java/com/mx/example/utils/SPUtils.kt +++ b/app/src/main/java/com/mx/example/utils/SPUtils.kt @@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.registerKotlinModule import com.mx.example.MyApp import com.mx.keyvalue.MXKeyValue -import com.mx.keyvalue.delegate.MXBaseDelegate import com.mx.keyvalue.crypt.KVAESCrypt +import com.mx.keyvalue.delegate.KVBaseDelegate import com.mx.keyvalue.store.sqlite.KVSqliteStore // 缓存类 @@ -33,12 +33,12 @@ object SPUtils { return KV.delete(key) } - class MXBeanDelegate( + class KVBeanDelegate( kv: MXKeyValue, private val clazz: Class, name: String, default: T? - ) : MXBaseDelegate(kv, name, default) { + ) : KVBaseDelegate(kv, name, default) { override fun stringToObject(value: String): T? { try { val mapper = ObjectMapper() diff --git a/app/src/main/java/com/mx/example/utils/StringUtils.kt b/app/src/main/java/com/mx/example/utils/StringUtils.kt index 871b6c7..5cf876c 100644 --- a/app/src/main/java/com/mx/example/utils/StringUtils.kt +++ b/app/src/main/java/com/mx/example/utils/StringUtils.kt @@ -1,6 +1,5 @@ package com.mx.example.utils -import java.lang.StringBuilder import java.security.MessageDigest import java.util.* -- Gitee From 5c5a86d323d86b6c4c8a7a6287c930da9356a367 Mon Sep 17 00:00:00 2001 From: zhangmengxiong Date: Tue, 28 Jun 2022 10:26:05 +0800 Subject: [PATCH 5/5] Update KVSqliteStore.kt --- .../src/main/java/com/mx/keyvalue/store/sqlite/KVSqliteStore.kt | 2 ++ 1 file changed, 2 insertions(+) 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 8aebad6..4cfcd7e 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 @@ -38,6 +38,8 @@ class KVSqliteStore : IKVStore { this.context = context this.name = name this.crypt = crypt + + this.sqliteHelper = KVSQLiteHelper(context, name) } override fun get(key: String): String? { -- Gitee