android 使用Room初始化数据库时出现重复类错误

qv7cva1a  于 2023-01-19  发布在  Android
关注(0)|答案(1)|浏览(247)

我开始摆弄Room,而现在我所做的只是为Kotlin中的Room创建一个带有简单数据库实现的虚拟类。
到目前为止,我得到了:

@Database(entities = [Junk::class], version = 1)
abstract class MyDatabase : RoomDatabase() {

      companion object {

        private var appDatabaseInstance: MyDatabase? = null

        fun getDatabase(applicationContext: Context): MyDatabase {
            if (appDatabaseInstance == null) {
                appDatabaseInstance = Room.databaseBuilder(
                    applicationContext,
                    MyDatabase::class.java,
                    "my_db"
                ).build()
            }
            return appDatabaseInstance!!
        }

    }
}

我的Junk实体现在只是一个非常简单的虚拟类

@Entity
class Junk {

    @PrimaryKey
    var id = 0
    var name: String?=null

}

出现错误消息:

C:\android_projects\room_test_app\app\build\generated\source\kapt\debug\hu\roomtest\stuff\db\MyDatabase_Impl.java:34: error: duplicate class: hu.roomtest.stuff.db.MyDatabase_Impl
public final class MyDatabase_Impl extends MyDatabase {
             ^

什么可能导致这种情况?
先谢了。

    • 英、日、时:**

我添加了一个DAO只是为了混日子,它对我的DAO说的也是同样的话:

C:\android_projects\room_test_app\app\build\generated\source\kapt\debug\hu\roomtest\stuff\db\JunkDAO_Impl.java:34: error: duplicate class: hu.roomtest.stuff.db.JunkDAO_Impl
    public final class MyDatabase_Impl extends MyDatabase {
                 ^
    • 英、日、日、时2:**

房间的分级配置:

def room_version = "2.5.0"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
    // To use Kotlin Symbol Processing (KSP)
    ksp "androidx.room:room-compiler:$room_version"
    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"
    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

同样在android/defaultConfig中,我有以下内容:

javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    • E D I T 3:**

当我尝试"创建项目"(ctrl f9)时,它会显示同样的错误信息,也有"清理项目"和"重建项目"。

ghhkc1vu

ghhkc1vu1#

在注解中尝试了几种解决方案后,发现KSP注解与KAPT注解冲突;每个都生成其自己版本的房间数据库类:

// To use Kotlin annotation processing tool (kapt)
kapt "androidx.room:room-compiler:$room_version"
// To use Kotlin Symbol Processing (KSP)
ksp "androidx.room:room-compiler:$room_version"

kapt和ksp两者都是相互替代的;后者比KAPT快2倍。
根据文件:
Kotlin符号处理(KSP)是一个API,您可以使用它来开发轻量级编译器插件。KSP提供了一个简化的编译器插件API,它利用了Kotlin的强大功能,同时将学习曲线保持在最小。与KAPT相比,使用KSP的注解处理器的运行速度可以快2倍。
因此,您需要保留其中的任何一个来解决这个冲突,但是请注意,ksp有一些您需要遵循的build procedure

相关问题