我正在开发中小企业常规房间应用程序,我试图使用房间将相同的数据保存到本地数据库中.我收到以下错误:

error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
    java.lang.String tocd);
                     ^

关于我的LocaDatabase类是这样的:

@Database(entities = [SessionData::class], version = 1, exportSchema = true)
abstract class LocalDatabase : RoomDatabase() {

    abstract fun dao(): CepsaDAO

}

我的数据类模型:

@Entity(tableName = Constants.DB_NAME)
data class SessionData (
    @PrimaryKey(autoGenerate = false) val tcod: String,
    @ColumnInfo(name = "sessionToken") val sessionToken: String,
)

和我的刀:

@Dao
interface CepsaDAO {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertTocd(tocd: String):Long   //This method rise the error 

    @Query("SELECT tcod FROM ${Constants.DB_NAME}")
    fun getTocd():String?

    @Query("SELECT sessionToken FROM ${Constants.DB_NAME} WHERE tcod=:tocd")
    fun getSessionData(tocd:String): String?

    @Query("DELETE FROM ${Constants.DB_NAME} WHERE sessionToken=:token")
    fun deleteSessionId(token: String):Int
}

为了实例化,我使用了dagger 插件:

@InstallIn(SingletonComponent::class)
@Module
class LocalModule {

    @Provides
    @Singleton
    fun provideDB(@ApplicationContext context: Context): LocalDatabase {
        return Room.databaseBuilder(
            context.applicationContext,
            LocalDatabase::class.java,
            Constants.DB_NAME
        ).build()
    }
}

@ActivityRetainedScoped
class LocalDatabaseUseCase @Inject constructor(@ApplicationContext val context: Context) {

    @Inject
    lateinit var db : LocalDatabase

... Some code
}

所以我在Stackoverflow和GitHub论坛上看到了一些解决方案,比如DownderKotlin版本或Upgrade the Room版本,但都不起作用.

以下是我的构建.gralde(应用程序):

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
    id 'org.jetbrains.kotlin.plugin.serialization'
}

dependencies{

kotlin_version=1.8.10
kotlin_serialization=1.5.0
core_ktx_version=1.10.1
room_version=2.5.0

implementation "androidx.core:core-ktx:$core_ktx_version"
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
    implementation 'androidx.activity:activity-compose:1.7.2'
    implementation platform('androidx.compose:compose-bom:2022.10.00')
    implementation 'androidx.compose.ui:ui'
    implementation 'androidx.compose.ui:ui-graphics'
    implementation 'androidx.compose.ui:ui-tooling-preview'
    implementation 'androidx.compose.material3:material3'
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialization"

//Room libraries
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    implementation "androidx.room:room-ktx:$room_version"
}

那么,我错过了什么?

提前谢谢!

推荐答案

你有:-

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertTocd(tocd: String):Long   //This method rise the error 

insertTocd函数正在try 插入到通过String类定义的表中.Kotlin String类没有@Entity批注.显然,它永远不会也不可能.它是Kotlin 的一部分.

当您插入到数据库中时,就是将数据插入到表表的列(S)中.Room通过@Database批注的entities参数中指定的类确定表(S).表格的列是根据@Entity个注解类的字段来确定的.

您有一个根据@Database(entities = [SessionData::class], version = 1, exportSchema = true)定义的类,因此您只能将数据插入到Constants.DB_NAME表中.在使用便利性@Insert时,传递给函数的对象类型必须是通过@Database注释的Entities参数定义的@Entity注释类.

看起来您正在try 仅使用值tcod向表中插入一行.

你可以做的是用一个@Query来做插入.

@Query("INSERT OR REPLACE INTO ${Constants.DB_NAME} VALUES(:tcod,'whatever would be a suitable default value');")
fun insertTocd(tcod: String)
  • note这不会返回值

或者,也许更有可能是您想要的,您可以使用如下内容:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(sessionData: SessionData): Long

fun insertTocd(tcod: String): Long {
    return insert(SessionData(tcod,"whatever would be a suitable default value")
} 
  • 注意,这将返回一个值,它将是插入行的rowid.rowid是一个特殊的列,它始终存在于表中(使用Room时).如果无法插入该行,则值将为-1.

  • 这两种情况whatever would be a suitable default value都可以是任何值,但不是空值,因为类型字符串将应用非空值约束.

Android相关问答推荐

当我的Log.i()不在主线程中时,如何在我的logcat中显示它?

写入排除例外以进行依赖性判断

在画布上画直线

如何在Jetpack Compose中使用Box Composable来实现这种布局?

泛型类型lambda函数参数作为函数参数

Android Jetpack Compose调用view-model函数仅一次

我们可以使用KSP读取类中变量的值吗?

如何在 compose 中使用可变对象?

从 HiltViewModel @Injection 访问 Application()

在模块 jetified-kotlin-stdlib-1.8.10 中发现重复的类 kotlin.random.jdk8,带有启动基准

Jetpack compose (Glance) 小部件在加载位图图像后不会重新组合

来自位图的 WearOS 图标不显示 colored颜色

无法找到方法 ''java.io.File > org.jetbrains.kotlin.gradle.tasks.KotlinCompile.getDestinationDir()

Jetpack Compose 动画的行为是什么?

从活动共享视图模型以使用 hilt 组合函数

LazyColumn 单选中的状态提升. Jetpack compose

使用 capacitor cordova 插件的 Android Studio 错误

Jetpack Compose:对角拆分卡片并将内容放入其中

如何在 TextInputEdit 中调整可绘制对象的大小

房间实时数据:启动时崩溃