Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

331
Visualizações
TypeConverters no funciona para Colecciones en @Query

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

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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.

over 4 years ago · Santiago Trujillo Relatório

0

Esta solución funcionó para mí: TypeConverter no funciona al actualizar List<Boolean> en Room Database

Básicamente, reemplace List<String> por ArrayList<String> .

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda