Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Quebrando cabeça com Courotines

O código abaixo funciona perfeitamente. Ele salva a informação no banco de dados. Contudo se após ou antes eu tento fazer outra operação no banco de dados esse código executa as vezes 13x, as vezes 15x. Acaba gerando repetidas insercoes no banco de dados. Alguém sabe o porquê e como resolver?

lifecycleScope.launch {
                            withContext(Dispatchers.IO) {
                                operacoesDao.salva(operacaocriada)

                            }
                        }
2 respostas
lifecycleScope.launch {
                        withContext(Dispatchers.IO) {
                            operacoesDao.salva(operacaocriada)
                            lifecycleScope.launch {
                                withContext(Dispatchers.IO){
                                    val aqui = null
                                    val nt = notasDao.buscaTodos()
                                    notasDao.salva(NotasAcoesBdrsEtfs(0L, "", "", "", ""))
                                }
                            }
                        }
                    }

Esse código está salvando 15 x as duas operações no banco de dados. Se altero para

lifecycleScope.launch {
                        withContext(Dispatchers.IO) {
                            operacoesDao.salva(operacaocriada)

                        }
                    }

Tudo funciona bem. Mas preciso fazer a outra alteração. Se tento fazer junto o app quebra e vem a exception de main thread. Nao sei qual o erro

solução!

Olá, Fernando!

Pelo que entendi, você está enfrentando um problema de repetição de inserções no banco de dados ao executar o código que você compartilhou. Isso pode acontecer devido ao uso do lifecycleScope.launch juntamente com o Dispatchers.IO, que permite a execução assíncrona do código.

Uma possível solução para evitar essas repetições é utilizar um mecanismo de controle, como uma variável booleana, para garantir que o código seja executado apenas uma vez. Por exemplo:

var isOperacaoSalva = false

lifecycleScope.launch {
    withContext(Dispatchers.IO) {
        if (!isOperacaoSalva) {
            operacoesDao.salva(operacaocriada)
            isOperacaoSalva = true
        }
    }
}

Dessa forma, a inserção no banco de dados só será realizada se a variável isOperacaoSalva for falsa, evitando assim as repetições indesejadas.

Espero que essa sugestão possa te ajudar a resolver o problema. Se tiver mais alguma dúvida, é só perguntar!

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software