A biblioteca de persistência Room do Android graciosamente inclui as anotações @Insert e @Update que funcionam para objetos ou coleções. No entanto, tenho um caso de uso (notificações push contendo um modelo) que exigiria um UPSERT, pois os dados podem ou não existir no banco de dados.
O Sqlite não tem upsert nativamente e as soluções alternativas são descritas nesta pergunta do SO . Dadas as soluções lá, como aplicá-las à Room?
Para ser mais específico, como posso implementar uma inserção ou atualização na Room que não quebraria nenhuma restrição de chave estrangeira? Usar insert com onConflict = REPLACE fará com que o onDelete de qualquer chave estrangeira para aquela linha seja chamada. No meu caso, onDelete causa uma cascata e a reinserção de uma linha fará com que as linhas em outras tabelas com a chave estrangeira sejam excluídas. Este NÃO é o comportamento pretendido.