Query method parameters should either be a type that can be converted into a database column or a List / Array that contains such type

Viewed 10192

I have a DB which has a custom data type FollowEntityType as a column.

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

Since it is a custom data type, I have defined a type converter.

class FollowDatabaseTypeConverter {

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

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

This works fine and I am able to store/retrieve values in the DB. However, in one of the queries, the build fails.

This is the query.

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

The build fails with the following 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.
    java.util.List<? extends FollowEntityType> entityTypeList, @org.jetbrains.annotations.NotNull()

The error is for entityTypeList field, and according to the error, this type should be one of the columns in the DB. I already have FollowEntityType as one of the column types. I don't understand why it is failing. Please help me out as I am not finding any solution to solve this problem.

6 Answers

This error occurred for me when I updated the kotlin library version without updating the room database version.

I was using Kotlin 1.5.10 and Room version 2.2.5 that caused the problem. Changing Room to 2.3.0 fixed the error.

I also see the same issue with Kotlin 1.7.10 + Room 2.4.2. No problem with Kotlin 1.6.21 + Room 2.4.2.

Kotlin 1.7.10 + Room 2.5.0-alpha02 is also okay, so I guess we have to wait for Room 2.5.0 formal release before using Kotlin 1.7.x

2022/8/4 UPDATE: After the AndroidX team released a new version of ROOM. Kotlin 1.7.10 + Room 2.4.3 is okay now.

Remove the suspend from the method when you use room query annotation. Like

Old

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

remove Suspend

New

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

I got this error when I tried executing this Query in Dao interface;

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

Fix it by adding @TypeConverters(MyConverter::class) as below;

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

I'm using room 2.4.2 with a android docs copy pasted documentation

It seems like this is a manifestation of room <-> kotlin version mismatch

I do get

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);

When i use

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

when i use

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

i don't get this error

Kindly update the Kotlin and Room DB version, It worked for me I changed to Kotlin 1.6.21 + Room 2.4.2. and it worked.

Related