diff --git a/README.md b/README.md index 43119d9..3819255 100644 --- a/README.md +++ b/README.md @@ -78,9 +78,10 @@ use `@Entity` annotation this class. prefixKeyWithClassName = "true" // if true, will add className as key's prefix, default false ) data class UserInfo( - // defValue: the default value + // name: the real key name + // defaultValue: the default value // enableReset: default true, if false will not reset to defValue in [reset()] function - @ColumnInfo(defValue = "david", enableReset = false) + @ColumnInfo(name = "realKeyName", defaultValue = "david", enableReset = false) val name: String, @ColumnInfo(defValue = "12") val age: Int, @@ -102,7 +103,7 @@ build project and we will get a Registry class. * this class is generated by https://github.com/lwj1994/ormkv for * [com.lwjlol.ormkv.demo.UserInfo], Please don't modify it! */ -public object UserRegistry { +public class UserRegistry { private val kvHandler: OrmKvHandler = com.lwjlol.ormkv.demo.KvStore.sharedPreferencesHandler private var _name: String? = null @@ -188,10 +189,11 @@ public object UserRegistry { then we can use the Registry class set/get value directly. ```kotlin -UserRegistry.name = "Mike" +val userRegistry = UserRegistry() +userRegistry.name = "Mike" -Log.d(tag, UserRegistry.toString()) -Log.d(tag, UserRegistry.name) +Log.d(tag, userRegistry.toString()) +Log.d(tag, userRegistry.name) ``` ## KSP diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5cfc1a8..2905983 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -72,8 +72,8 @@ dependencies { implementation(project(":sharedPreferences")) implementation(project(":mmkv")) implementation(kotlin("stdlib")) - ksp(project(":compiler")) -// kapt(project(":compiler")) +// ksp(project(":compiler")) + kapt(project(":compiler")) implementation(project(":compiler")) } diff --git a/app/src/main/java/com/lwjlol/ormkv/demo/ConfigModel.kt b/app/src/main/java/com/lwjlol/ormkv/demo/ConfigModel.kt index 26f8f55..dbb7e09 100644 --- a/app/src/main/java/com/lwjlol/ormkv/demo/ConfigModel.kt +++ b/app/src/main/java/com/lwjlol/ormkv/demo/ConfigModel.kt @@ -11,9 +11,9 @@ import com.lwjlol.ormkv.annotation.Ignore data class ConfigModel( @Ignore val value3: ByteArray, - @ColumnInfo(defValue = "22") + @ColumnInfo(defaultValue = "22") val value4: Long, - @ColumnInfo(defValue = "") + @ColumnInfo(defaultValue = "false") val v4: Boolean, val v5: Long, val v6: Float, diff --git a/app/src/main/java/com/lwjlol/ormkv/demo/Constants.java b/app/src/main/java/com/lwjlol/ormkv/demo/Constants.java new file mode 100644 index 0000000..4ebf015 --- /dev/null +++ b/app/src/main/java/com/lwjlol/ormkv/demo/Constants.java @@ -0,0 +1,5 @@ +package com.lwjlol.ormkv.demo; + +class Constants { + public static final String PWD = "121312"; +} diff --git a/app/src/main/java/com/lwjlol/ormkv/demo/MainActivity.kt b/app/src/main/java/com/lwjlol/ormkv/demo/MainActivity.kt index 89f33d6..160e130 100644 --- a/app/src/main/java/com/lwjlol/ormkv/demo/MainActivity.kt +++ b/app/src/main/java/com/lwjlol/ormkv/demo/MainActivity.kt @@ -10,6 +10,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) updateText() + val user = User() // UserSp.name diff --git a/app/src/main/java/com/lwjlol/ormkv/demo/UserModel.kt b/app/src/main/java/com/lwjlol/ormkv/demo/UserModel.kt index 6dbc547..9e6a187 100644 --- a/app/src/main/java/com/lwjlol/ormkv/demo/UserModel.kt +++ b/app/src/main/java/com/lwjlol/ormkv/demo/UserModel.kt @@ -8,22 +8,25 @@ import com.lwjlol.ormkv.annotation.Ignore * @author luwenjie on 2019-08-11 20:16:58 */ @Entity( - prefixKeyWithClassName = true, - handlerCodeReference = "com.lwjlol.ormkv.demo.KvStore.sp" + className = "User", + handlerCodeReference = "com.lwjlol.ormkv.demo.KvStore.sp", + prefixKeyWithClassName = true ) data class UserModel( + @ColumnInfo(name = "SECNAME_XXD", defaultValue = Constants.PWD) + val secname: String, @Ignore // val skip: String, - @ColumnInfo(defValue = "qweqweqe") + @ColumnInfo(defaultValue = "qweqweqe") val name: String, @Ignore - @ColumnInfo(defValue = "12") + @ColumnInfo(defaultValue = "12") val age: Int, - @ColumnInfo(defValue = "12312312", enableReset = false) + @ColumnInfo(defaultValue = "12312312", enableReset = false) val id: Long, - @ColumnInfo(defValue = "false") + @ColumnInfo(defaultValue = "false") val isMan: Boolean, - @ColumnInfo(defValue = "1231", enableReset = false) + @ColumnInfo(defaultValue = "1231", enableReset = false) val temperature: Float ) { diff --git a/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/KspOrmkvProvider.kt b/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/KspOrmkvProvider.kt index 83f3be5..2f3f005 100644 --- a/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/KspOrmkvProvider.kt +++ b/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/KspOrmkvProvider.kt @@ -85,7 +85,7 @@ class KspOrmkvProcessor( name = className } val fileName = if (classNameArg.isNotEmpty()) name else "${name}${END_FIX}" - val typeSpec = TypeSpec.objectBuilder(fileName) + val typeSpec = TypeSpec.classBuilder(fileName) .addKdoc("this class is generated by https://github.com/lwj1994/ormkv for [${packageName}.${className}], Please don't modify it!") if (handlerCodeReferenceArg.isEmpty()) { @@ -114,67 +114,74 @@ class KspOrmkvProcessor( member.annotations.find { it.annotationType.resolve().declaration.qualifiedName?.asString() == Ignore::class.qualifiedName } != null val columnInfo = member.annotations.find { it.annotationType.resolve().declaration.qualifiedName?.asString() == ColumnInfo::class.qualifiedName } - var defValue: String = "" + var defaultValue: String = "" + var columnName = member.name?.asString() ?: "" var enableReset = true columnInfo?.arguments?.forEach { - if (it.name?.asString() == "defValue") { - defValue = it.value?.toString() ?: "" + if (it.name?.asString() == DEFAULT_VALUE) { + defaultValue = it.value?.toString() ?: "" } - if (it.name?.asString() == "enableReset") { + if (it.name?.asString() == NAME) { + it.value?.toString()?.apply { + if (isNotEmpty()) columnName = this + } + } + if (it.name?.asString() == ENABLE_RESET) { enableReset = it.value as Boolean } } val memberTypeName = member.type.resolve().declaration.qualifiedName?.asString() ?: "" val valueName = "_${member.name?.asString()}" val propertyName = member.name?.asString() ?: "" + val keyUnitName = columnName.ifEmpty { member.name?.asString() ?: "" } var getName = "" val prefix = "$packageName.${className}" - val keyName = if (prefixKeyArg) "${prefix}_$propertyName" else propertyName + val keyName = if (prefixKeyArg) "${prefix}_$keyUnitName" else keyUnitName when (memberTypeName) { "kotlin.String" -> { - getName = "get(\"$keyName\", \"\"\"$defValue\"\"\") as String" + getName = "get(\"$keyName\", \"\"\"$defaultValue\"\"\") as String" } "kotlin.Float" -> { - defValue = defValue.ifEmpty { "0F" } - if (!defValue.endsWith('F')) { - defValue = "${defValue}F" + defaultValue = defaultValue.ifEmpty { "0F" } + if (!defaultValue.endsWith('F')) { + defaultValue = "${defaultValue}F" } - getName = "get(\"$keyName\", $defValue) as Float" + getName = "get(\"$keyName\", $defaultValue) as Float" } "kotlin.Int" -> { - defValue = defValue.ifEmpty { "0" } - getName = "get(\"$keyName\", $defValue) as Int" + defaultValue = defaultValue.ifEmpty { "0" } + getName = "get(\"$keyName\", $defaultValue) as Int" } "kotlin.Long" -> { - defValue = defValue.ifEmpty { "0L" } - if (!defValue.endsWith('L')) { - defValue = "${defValue}L" + defaultValue = defaultValue.ifEmpty { "0L" } + if (!defaultValue.endsWith('L')) { + defaultValue = "${defaultValue}L" } - getName = "get(\"$keyName\", $defValue) as Long" + getName = "get(\"$keyName\", $defaultValue) as Long" } "kotlin.Boolean" -> { - defValue = defValue.ifEmpty { "false" } - getName = "get(\"$keyName\", $defValue) as Boolean" + defaultValue = defaultValue.ifEmpty { "false" } + getName = "get(\"$keyName\", $defaultValue) as Boolean" } "kotlin.ByteArray" -> { - defValue = defValue.ifEmpty { "ByteArray(0)" } + defaultValue = defaultValue.ifEmpty { "ByteArray(0)" } getName = "get(\"$keyName\", ByteArray(0)) as ByteArray" } else -> { - defValue = "error" + defaultValue = "error" } } // ignore if (ignore && !toModelError) { - if (defValue == "error") { + if (defaultValue == "error") { toModelError = true return@forEachIndexed } if (memberTypeName.contains("String")) { - toModelCode.append("|$propertyName = \"$defValue\", \n") + toModelCode.append("|$propertyName = \"$defaultValue\", \n") } else { - toModelCode.append("|$propertyName = $defValue, \n") + toModelCode.append("|$propertyName = $defaultValue, \n") } return@forEachIndexed } @@ -219,9 +226,9 @@ class KspOrmkvProcessor( updateCode.append("|$propertyName = model.$propertyName\n") if (enableReset) { if (memberTypeName.contains("String")) { - clearCode.append("$propertyName = \"\"\"$defValue\"\"\" \n") + clearCode.append("$propertyName = \"\"\"$defaultValue\"\"\" \n") } else { - clearCode.append("$propertyName = $defValue \n") + clearCode.append("$propertyName = $defaultValue \n") } } } @@ -342,4 +349,7 @@ class KspOrmkvProvider : SymbolProcessorProvider { private const val END_FIX = "Registry" private const val LOG = false private const val HANDLER = "kvHandler" -private const val TAG = "KspOrmkv" \ No newline at end of file +private const val TAG = "KspOrmkv" +private const val DEFAULT_VALUE = "defaultValue" +private const val NAME = "name" +private const val ENABLE_RESET = "enableReset" \ No newline at end of file diff --git a/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/OrmkvProcessor.kt b/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/OrmkvProcessor.kt index 787a82e..1d4f10e 100644 --- a/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/OrmkvProcessor.kt +++ b/compiler/src/main/java/com/lwjlol/ormkv/annotation/compiler/OrmkvProcessor.kt @@ -63,6 +63,7 @@ class OrmkvProcessor : AbstractProcessor() { entity: Entity ) { var name = entity.className + val prefixKeyWithClassName = entity.prefixKeyWithClassName val generatePackageName = if (entity.className.contains('.')) { name = entity.className.substringAfterLast('.') entity.className.substringBeforeLast('.') @@ -70,7 +71,7 @@ class OrmkvProcessor : AbstractProcessor() { packageName } val fileName = if (entity.className.isNotEmpty()) name else "${name}_${END_FIX}" - val typeSpec = TypeSpec.objectBuilder(fileName) + val typeSpec = TypeSpec.classBuilder(fileName) .addKdoc("this class is generated by https://github.com/lwj1994/ormkv for [${packageName}.${className}], Please don't modify it!") typeSpec.addProperty( @@ -89,9 +90,10 @@ class OrmkvProcessor : AbstractProcessor() { var toModelError = false allMembers.forEachIndexed { _, member -> if (member.kind.isField && !member.modifiers.contains(Modifier.STATIC)) { - val ignore = member.getAnnotation(Ignore::class.java) - val spColumnInfo = member.getAnnotation(ColumnInfo::class.java) - val defInitValue = spColumnInfo?.defValue ?: "" + val ignore: Ignore? = member.getAnnotation(Ignore::class.java) + val spColumnInfo: ColumnInfo? = member.getAnnotation(ColumnInfo::class.java) + val defInitValue = spColumnInfo?.defaultValue ?: "" + val columnName = spColumnInfo?.name ?: "" val clear = spColumnInfo?.enableReset ?: true val memberTypeName = member.asType().asTypeName() val valueName = "_${member.simpleName}" @@ -118,16 +120,16 @@ class OrmkvProcessor : AbstractProcessor() { paramType.contains("Boolean") -> "${if (defInitValue.isNotEmpty()) defInitValue.toBoolean() else false}" paramType.contains("Int") -> "${if (defInitValue.isNotEmpty()) defInitValue.toInt() else 0}" paramType.contains("Long") -> "${if (defInitValue.isNotEmpty()) defInitValue.toLong() else 0}".run { - if (!contains("L")){ + if (!contains("L")) { "${this}L" - }else{ + } else { this } } paramType.contains("ByteArray") -> "ByteArray(0)" paramType.contains("Float") -> { val res = - (if (spColumnInfo.defValue.isNotEmpty()) spColumnInfo.defValue.toFloat() else 0F).toString() + (if (spColumnInfo?.defaultValue?.isNotEmpty() == true) spColumnInfo.defaultValue.toFloat() else 0F).toString() if (!res.contains("F")) { "${res}F" } else { @@ -148,17 +150,22 @@ class OrmkvProcessor : AbstractProcessor() { } return@forEachIndexed } + + val keyUnitName = columnName.ifEmpty { propertyName } + val prefix = "$packageName.${className}" + val keyName = if (prefixKeyWithClassName) "${prefix}_$keyUnitName" else keyUnitName + val getName = when { - paramType.contains("String") -> "get(\"$propertyName\", \"\"\"$defValue\"\"\") as String" - paramType.contains("Boolean") -> "get(\"$propertyName\", $defValue) as Boolean" - paramType.contains("Int") -> "get(\"$propertyName\", $defValue) as Int" - paramType.contains("Long") -> "get(\"$propertyName\", $defValue) as Long" - paramType.contains("Float") -> "get(\"$propertyName\", $defValue) as Float" - paramType.contains("ByteArray") -> "get(\"$propertyName\", ByteArray(0)) as ByteArray" + paramType.contains("String") -> "get(\"$keyName\", \"\"\"$defValue\"\"\") as String" + paramType.contains("Boolean") -> "get(\"$keyName\", $defValue) as Boolean" + paramType.contains("Int") -> "get(\"$keyName\", $defValue) as Int" + paramType.contains("Long") -> "get(\"$keyName\", $defValue) as Long" + paramType.contains("Float") -> "get(\"$keyName\", $defValue) as Float" + paramType.contains("ByteArray") -> "get(\"$keyName\", ByteArray(0)) as ByteArray" else -> "unsupport" } - val setName = """put("$propertyName", value)""" + val setName = """put("$keyName", value)""" typeSpec.addProperty( PropertySpec.builder(valueName, typeName.copy(true)) @@ -255,7 +262,7 @@ class OrmkvProcessor : AbstractProcessor() { private fun TypeSpec.Builder.addUpdate(code: String, typeName: TypeName): TypeSpec.Builder { return addFunction( FunSpec.builder("update") - .addParameter(ParameterSpec.builder("model",typeName).build()) + .addParameter(ParameterSpec.builder("model", typeName).build()) .addCode(code) .build() ) diff --git a/core/src/main/java/com/lwjlol/ormkv/annotation/ColumnInfo.kt b/core/src/main/java/com/lwjlol/ormkv/annotation/ColumnInfo.kt index ef289c2..3fc0380 100644 --- a/core/src/main/java/com/lwjlol/ormkv/annotation/ColumnInfo.kt +++ b/core/src/main/java/com/lwjlol/ormkv/annotation/ColumnInfo.kt @@ -1,13 +1,14 @@ package com.lwjlol.ormkv.annotation /** - * @param defValue 默认值 + * @param defaultValue 默认值 * @param enableReset 允许恢复默认值 * @param handlerCodeReference */ @Target(AnnotationTarget.FIELD) @Retention(AnnotationRetention.SOURCE) annotation class ColumnInfo( - val defValue: String = "", - val enableReset: Boolean = true + val defaultValue: String = "", + val name: String = "", + val enableReset: Boolean = true, )