Tengo una entidad llamada Eventos que se define de la siguiente manera:
@Entity(tableName = "Events") data class Event(@PrimaryKey val id: Long, val name: String, val venues: Set<String>, val rating: Int) Tengo un par de métodos @TypeConverter para manejar Set<String> :
@TypeConverter fun fromStringToStringSet(str: String): Set<String> = str.split("<|>") @TypeConverter fun fromStringSetToString(set: Set<String>): String = set.joinToString("<|>") En mi Dao , tengo un método anotado con @Query de la siguiente manera:
@Query("UPDATE Events SET name = :name, venues = :venues WHERE id = :id") fun updateAndRetainRating(id: Long, name: String, venues: Set<String>)Cuando trato de actualizar un evento con 2 lugares, aparece un error de tiempo de ejecución que me dice que no se pudo compilar el SQL. El SQL generado es:
UPDATE Events SET name = ?, venues = ?,? WHERE id = ? Esto obviamente está mal. Mirando el código generado, Room obtiene el tamaño de Set<String> y agrega la misma cantidad de ? s.
¿Por qué no se utiliza mi TypeConverter ? No enfrento este problema en otras consultas ( @Insert y @Query (para SELECT )). Otros TypeConverter también funcionan bien.
EDITAR: El mismo problema también ocurre si uso List<String> + TypeConverter s en lugar de Set<String> .
Mirando la documentación de Room, parece que cada vez que usamos una Collection en @Query , pasa por alto TypeConverter s y se aplana de inmediato.
Por ejemplo, esto:
@Query("SELECT * FROM Customers WHERE city IN (:cities)") fun getCustomersInCities(cities: List<String>): Flowable<List<Customer>> da como resultado SELECT * FROM Customers WHERE city IN ('london', 'paris') si cities contienen "londres" y "paris".
Desafortunadamente, lo siguiente también se convierte de manera similar:
@Query("UPDATE Customers SET phoneNumbers = :phoneNumbers WHERE id = :id") fun updateCustomerPhoneNumbers(id: Long, phoneNumbers: List<String>) El resultado es UPDATE Customers SET phoneNumbers = 1234567890, 9876543210 WHERE id = 23 si id es 23 y phoneNumbers contiene "1234567890" y "9876543210".
Si bien esto tiene sentido, es realmente inconveniente y debe documentarse más claramente.
Esta solución funcionó para mí: TypeConverter no funciona al actualizar List<Boolean> en Room Database
Básicamente, reemplace List<String> por ArrayList<String> .