La biblioteca de persistencia Room de Android incluye gentilmente las anotaciones @Insert y @Update que funcionan para objetos o colecciones. Sin embargo, tengo un caso de uso (notificaciones push que contienen un modelo) que requeriría un UPSERT, ya que los datos pueden o no existir en la base de datos.
Sqlite no tiene upsert de forma nativa, y las soluciones se describen en esta pregunta SO . Dadas las soluciones allí, ¿cómo se las aplicaría a Room?
Para ser más específico, ¿cómo puedo implementar una inserción o actualización en Room que no rompa ninguna restricción de clave externa? El uso de insert con onConflict = REPLACE hará que se llame a onDelete para cualquier clave externa a esa fila. En mi caso, onDelete provoca una cascada, y reinsertar una fila hará que las filas en otras tablas con la clave externa se eliminen. Este NO es el comportamiento previsto.