19

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.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
thedarkpassenger
  • 7,158
  • 3
  • 37
  • 61
  • 2
    Where did you include your FollowDatabaseTypeConverter as `TypeConverters`? On top of `@Entity` or `@Database`. If it's on @Entity, then it has no affect on your `@Dao` queries. – musooff Dec 22 '18 at 10:18
  • 1
    Read more on `@TypeConverters` in [here](https://developer.android.com/reference/android/arch/persistence/room/TypeConverters) – musooff Dec 22 '18 at 10:24
  • @musooff : I included it on top of database. – thedarkpassenger Dec 23 '18 at 14:37
  • Then, maybe it's because it is `List`. Try adding a type converter for `List` to `List`. If that's the case, then it must be a bug and you can report it. – musooff Dec 23 '18 at 15:44

7 Answers7

39

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.

Vasudev
  • 1,936
  • 19
  • 17
  • 6
    I had a similar issue after updating Kotlin to 1.6.0—updating Room from 2.3.0 to 2.4.0-beta01 resolved it. – Bink Nov 16 '21 at 22:35
  • Updating to 2.4.0-beta01 works. Note that you also have to upgrade the compileSdk version to 31 – MG1616 Nov 30 '21 at 12:33
21

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.

Sam Lu
  • 3,448
  • 1
  • 27
  • 39
8

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>
4

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)
Ahmet B.
  • 1,290
  • 10
  • 20
1

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.

Vivek Pratap Singh
  • 1,564
  • 16
  • 26
1

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

For Kotlin 1.9.0 and Room 2.5.2, i removed kapt plugin and replaced it with ksp following this doc. ksp and Kotlin have compatible versioning.

Jemshit
  • 9,501
  • 5
  • 69
  • 106
0

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

madabrowski
  • 1,273
  • 14
  • 17