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

[Dúvida] Query de busca não está funcionando. Alguém sabe o porquê?

val teste = operacoesDao.buscaTodos()
val dataunsicas = arraydedatas.distinct()
dataunsicas.forEach{
    val teste2=  operacoesDao.buscaTodos()

                        }

Esse é um corte do código. Tudo está dentro de uma corotina e a função buscaTodos() é uma suspend fun. Caso é que val teste recebe um valor e val teste2 não. LogCat não apresenta nada. A única diferença é que uma chamada é dentro do loop foreach e a outra é fora. Alguém sabe o que está acontecendo? ( e principalmente como resolve?). Tentei uma estrutura com loop for comum e ocorre o mesmo. Aí não testei substituir por um loop while ( mas evito while pra não cair em loops infinitos)

6 respostas

Fala Fernando, de boa ?

Cara, to um pouco confuso com o cenário em si que tu quer fazer, se você já tem a lista na parte de cima, por que tem feito outra chamada dentro do for, isso que nem estou discutindo o fator de disso "parar" teu app dependendo do tamanho de dataunsicas...

Consegue dar o contexto ? Assim a gente consegue entender e talvez trabalhar com alguma outra solução que te ajude a resolver isso...

Ola Matheus tudo bem? Na verdade a chamada dentro do looping é mais específica

val teste2 = operacaoDao.buscaPorData(data) 

Mas eu testei de tudo e dentro do looping não retorna valor. Se eu faço essa mesma chamada fora do looping há o retorno. Logo a query funciona. Fiz uma gambiarra. Através da chamada que busca todos criei um Array e passei ele pelo looping for separando por data. Resolveu o problema. Mas entendo que é uma solução fraca visto que não sei primeiramente o que está dando errado. Tenho duas teorias:

A primeira é que a minha dependências do room (2.4.1) e do lifecycle (2.5.1) estão desatualizadas e que esse erro potencial encontra solução em versões recentes. Contudo quando tento atualizar o gradle tudo entra em conflito ( o caos ). Então deixo nessas versões porque está funcionando assim . Não sei resolver os conflitos de dependências.

A segunda teoria é que estou de alguma forma mandando duas corotinas acessar os mesmo dados no bd e o room está dando prioridade pra uma delas. Já tive nesse projeto problemas semelhantes onde alguns resultados esperados não eram obtidos porque parte do código "furava a fila". Resolvi deixando o código mais síncrono obrigando a uma corotina especifica ser executa somente o término de outra corotina específica.

Por hora a gambiarra sanou a pane, mas me incomoda fazer gambiarras hehe

Fernando,

Cara, essa primeira tese é um caso bem bom, pode ser que você tenha caido num corner case muito bizarro com essa combinação de versões e que as coisas tenham sido resolvidas em versões acima, acredite nisso, porque eu já passei por isso, fazendo umas queries com join table e afins, tinha algum problema interno e quando atualizei a lib tudo começou a rodar liso.

Acho que tu poderia tentar usar um async await das coroutines para tentar sanar isso, mas é só um paliativo...

Pois é... já tive nesse mesmo projeto um erro muito semelhante, mas o logcat pegava. Era algo do tipo "Dispeacher time out alguma coisa". Daí atualizei o room, o lifecycle e troquei o annotation para o KSP.... e sem nenhuma alteração no projeto tudo rodou mil maravilhas... agora pra contonar o problema estou reescrevendo e tentando evitar o uso de query de busca... resultado é... funciona... mas dá um trabalho do cão... tô usando código bem básico... o código está poluído de arrayList, e loops for... fazendo os filtros que a query de busca fazia na unha kkk. Por hora vai assim

solução!

se você deixar separado em camadas, consegue colocar esse código num ponto que se for atualizar as libs algum dia, consiga mudar essa camada sem que isso quebre as demais, não é o ideal, mas acho que pode ajudar.

otima ideia... obrigado. Vou fazer umas anotações e quando surgir uma atualização estavel das dependências verifico se tudo ocorre ok.