Tencent / wcdb

WCDB is a cross-platform database framework developed by WeChat.
Other
10.61k stars 1.39k forks source link

按Wiki中“Java|Kotlin 安装与兼容性” 引入WCDB后无法生成对应的DBxxx类 #1108

Closed 243573077 closed 1 month ago

243573077 commented 1 month ago

问题描述: AS 使用的是 Android Studio Jellyfish | 2023.3.1 RC 2 WCDB 使用 java or kotlin 库, 接入版本 2.1.4 ,创建实体bean 类Bill,按官方文档接入编译后 ,通过annotationProcessor("com.tencent.wcdb:compiler:2.1.4")的方式引用wcdb的注解处理器,AS能正常编译和生成apk 但在 “db.createTable(tableName,DBBill)”中 无法引用到对应的 DBBill生成类。 官方Widi 中接入指导比较简洁,没有2.X版本对应的 Demo示例。 另外自己也尝试过 使用ksp的方式,但AS 会报编译失败。

求助: 恳请官方小伙伴,帮忙确认下是否wcdb哪里配置有问题,或者 官方是否考虑出一个 KSP 版本的Demo?thanks

具体配置和使用 如下: 项目根目录build.gradle.kts 配置内容 `

 plugins {
    id("com.android.application") version "8.2.1" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
    id("org.jetbrains.kotlin.kapt") version "1.9.0" apply false
 //    id("com.google.devtools.ksp") version "1.8.21-1.0.11" apply false
 }
buildscript {
    dependencies {
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:1.8.21-1.0.11")
        classpath(kotlin("gradle-plugin", version = "1.9.0"))
    }
}

`

app 目录 build.gradle.kts配置 内容 `

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
//    id("com.google.devtools.ksp")
    id("org.jetbrains.kotlin.kapt")
}
android {
    namespace = "com.xfj.xfj"
    compileSdk = 34

defaultConfig {
    applicationId = "com.xfj.xfj"
    minSdk = 26
    targetSdk = 34
    versionCode = 1
    versionName = "1.0"

    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        isMinifyEnabled = false
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}
compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
buildFeatures {
    viewBinding = true
}
kotlinOptions {
    jvmTarget = "1.8"
}
}
dependencies {

implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
implementation("androidx.navigation:navigation-fragment:2.6.0")
implementation("androidx.navigation:navigation-ui:2.6.0")
implementation("com.tencent:mmkv:1.3.4")
implementation("com.tencent.wcdb:main:2.1.4")
implementation("com.tencent.wcdb:annotation:2.1.4")
  //    ksp("com.tencent.wcdb:compiler:2.1.4")
**annotationProcessor**("com.tencent.wcdb:compiler:2.1.4")
implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.20"))
implementation("com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava")

} `

实体Bill类定义 `

import com.tencent.wcdb.WCDBField
import com.tencent.wcdb.WCDBTableCoding
import com.xfj.xfj.entity.Constant

@WCDBTableCoding
open class Bill {
    @WCDBField
    var mId: String = “”
    @WCDBField
    var mType: Int = 0 
    @WCDBField
    var mKind: Int = -1 
    @WCDBField
    var mMoney: Float = 0f 
    @WCDBField
    var mNote: String = “”
    @WCDBField
    var mPayWay: Int = 0 
    @WCDBField
    var mTime: Long = -1L 
    @WCDBField
    var mTag: String =“”
    @WCDBField
    var mTagNum: Int = 0 
}

在数据库创建表时,**出现无法 引用到 DBBill的情况**

class DBUtils {

    val db: Database by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
        Database(mPath)
    }
    private var mPath: String = "test.db"

    fun test(tableName: String): Unit {
        // 问题点发生在这里
        db.createTable(tableName,**DBbill**)
    }
}

`

将annotationProcessor 方式换为 KSP 方式,会AS 编译不过,注释掉kapt相关内容,根目录gadle.kts文件修改为 `

plugins {
    id("com.android.application") version "8.2.1" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
//    id("org.jetbrains.kotlin.kapt") version "1.9.0" apply false
    id("com.google.devtools.ksp") version "1.8.21-1.0.11" apply false
}

buildscript {
    dependencies {
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:1.8.21-1.0.11")
        classpath(kotlin("gradle-plugin", version = "1.9.0"))
    }
}

`

app 内gradle.kts更改为: `

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")
//    id("org.jetbrains.kotlin.kapt")
}
dependencies {
    implementation("com.tencent.wcdb:main:2.1.4")
    implementation("com.tencent.wcdb:annotation:2.1.4")
    ksp("com.tencent.wcdb:compiler:2.1.4")
}

AS 提示 ![图片](https://github.com/Tencent/wcdb/assets/4500285/8f82b0c2-9147-4e93-a34d-baada29e3215) 对应打印信息:

Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.

Could not create task ':app:kspDebugKotlin'. Cannot query the value of task ':app:compileDebugKotlin' property 'moduleName' because it has no value available.

Qiuwen-chen commented 1 month ago

You should use ksp and try to solve the compile issue.

If the problem still exists, you can give a demo project to me to reproduce it.

243573077 commented 4 weeks ago

Thank you. I had resolved it. My resolution is like that : create a new empty projection by ksp and language needed to choose kotlin. configure your ksp env ok. Remove all compose depends in build.gradle.kts (in app module). And then add dependes in your build.gradle.kts (in app module). implementation 'com.tencent.wcdb:main:2.1.4' implementation 'com.tencent.wcdb:annotation:2.1.4' annotationProcessor 'com.tencent.wcdb:compiler:2.1.4' ksp 'com.tencent.wcdb:compiler:2.1.4'