我开始摆弄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)时,它会显示同样的错误信息,也有"清理项目"和"重建项目"。
1条答案
按热度按时间ghhkc1vu1#
在注解中尝试了几种解决方案后,发现KSP注解与KAPT注解冲突;每个都生成其自己版本的房间数据库类:
kapt和ksp两者都是相互替代的;后者比KAPT快2倍。
根据文件:
Kotlin符号处理(KSP)是一个API,您可以使用它来开发轻量级编译器插件。KSP提供了一个简化的编译器插件API,它利用了Kotlin的强大功能,同时将学习曲线保持在最小。与KAPT相比,使用KSP的注解处理器的运行速度可以快2倍。
因此,您需要保留其中的任何一个来解决这个冲突,但是请注意,ksp有一些您需要遵循的build procedure。