sqlite 查询方法参数应该是可以转换为数据库列的类型,或者是包含此类类型的List / Array

v1l68za4  于 2023-10-23  发布在  SQLite
关注(0)|答案(7)|浏览(115)

我有一个DB,它有一个自定义的数据类型**FollowEntityType**作为列。

@Entity(primaryKeys = arrayOf("id", "type"), tableName = "follow_info")
data class FollowInfoEntity(
        @ColumnInfo(name = "id") var id: String,
        @ColumnInfo(name = "type") var type: FollowEntityType,
)

因为它是一个自定义数据类型,所以我定义了一个类型转换器。

class FollowDatabaseTypeConverter {

    @TypeConverter
    fun toFollowEntity(entityType: String?): FollowEntityType? {
        return FollowEntityType.from(entityType ?: Constants.EMPTY_STRING)
    }

    @TypeConverter
    fun toString(entityType: FollowEntityType?): String? {
        return entityType?.name
    }
}

这工作正常,我能够在DB中存储/检索值。但是,在其中一个查询中,构建失败。
这就是查询。

@Query("select * from follow_info where type in (:entityTypeList)")
fun getFollowedEntitiesByType(entityTypeList: List<FollowEntityType>) : List<FollowInfoEntity>

生成失败,并出现以下错误。

Query method parameters should either be a type that can be converted into a database column or a List / Array that contains such type. You can consider adding a Type Adapter for this.
    java.util.List<? extends FollowEntityType> entityTypeList, @org.jetbrains.annotations.NotNull()

错误是forentityTypeList字段,根据错误,此类型应该是DB中的一列。我已经有FollowIdentyType作为列类型之一。我不明白为什么它失败了。请帮助我,因为我没有找到任何解决方案来解决这个问题。

6kkfgxo0

6kkfgxo01#

当我更新了Kotlin库版本而没有更新房间数据库版本时,我发生了这个错误。
我使用的是Kotlin1.5.10和Room 2.2.5版本,导致了这个问题。将房间更改为2.3.0修复了错误。

rggaifut

rggaifut2#

我在Kotlin1.7.10 + Room 2.4.2中也看到了同样的问题。Kotlin1.6.21 +房间2.4.2没有问题。

Kotlin1.7.10 + Room 2.5.0-alpha 02也可以,所以我猜我们必须等待Room 2.5.0正式发布后才能使用Kotlin1.7.x

2022/8/4:在AndroidX团队发布了新版本的ROOM之后。Kotlin1.7.10 +房间2.4.3现在可以了。
2022/10/7:如果您使用的是Kotlin1.9.0或更高版本,使用Room 2.5.2编译将无法再次工作。必须使用Kotlin1.9.0 + Room 2.6.0-rc 01(或更高版本)。Google也建议使用KSP而不是KAPT。我正在使用Kotlin1.9.0 + KSP 1.9.0-1.0.13 + Room 2.5.2

gfttwv5a

gfttwv5a3#

当您使用房间查询注解时,从方法中删除挂起。像

@Query("SELECT * FROM userSession where isSync=0 ORDER BY createdOnInMills")
suspend fun getUnSyncSession(): List<SessionModel>

删除挂起

@Query("SELECT * FROM userSession where isSync=0 ORDER BY createdOnInMills")
fun getUnSyncSession(): List<SessionModel>
8e2ybdfx

8e2ybdfx4#

我得到了这个错误,当我试图执行这个查询在道接口;

@Query("DELETE FROM my_table WHERE customModel = :customModel")
fun deleteData(customModel: CustomModel)

通过添加@TypeConverters(MyConverter::class)来修复它,如下所示;

@TypeConverters(MyConverter::class)
@Query("DELETE FROM my_table WHERE customModel = :customModel")
fun deleteData(customModel: CustomModel)
0yg35tkg

0yg35tkg5#

查询方法参数应该是可以转换为数据库列的类型或包含此类类型的List / Array。您可以考虑为此添加类型适配器。Kotlin.协程.Continuation<?superKotlin.Unit> continuation);
对于Kotlin 1.9.0Room 2.5.2,我删除了kapt插件,并将其替换为kspksp和Kotlin具有兼容的版本。

7dl7o3gd

7dl7o3gd6#

请更新Kotlin和Room DB版本,它对我有效,我更改为Kotlin1.6.21 + Room 2.4.2.,它工作。

vyu0f0g1

vyu0f0g17#

我用的是2.4.2号房间的android docs复制粘贴的文档
看起来这是房间<->Kotlin版本不匹配的表现
我确实得到

error: Query method parameters should either be a type that can be converted into a database column or a List / Array that contains such type. You can consider adding a Type Adapter for this.
    kotlin.coroutines.Continuation<? super kotlin.Unit> continuation);

当我使用

classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0

当我使用

classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21'

我没有得到这个错误

相关问题