Query Firebase Java Android
26/05/2020
0
Pelo amor por Deus.. qm puder me ajude!!
tenho no meu banco de dados a seguinte estrutura
id="fsa134r1341312f3134fh1jh"
jogo = "01, 03, 15, 28, 37, 39, 42, 46, 51, 55, 58, 59"
isso com vários registro né!!
to tetando fazer um filtro que me traga todos os registros do campo jogo que contenham os 6 números: exemplo:
"03, 15, 42, 51, 55, 59"
ja tentei com quase todos os métodos possíveis e não consegui!!!
startAt + endAt
whereEqualTo
whereArrayContains
whereArrayContainsAny
etc....
tentei mudar o campo la no banco para Array
e utilizar o whereArrayContainsAny foi que chegou mais proximo, porem qndo tinha um numero que nao constava no banco ele trazia por conta dos outros números!
Alguem tem indeia??
ja pensei em criar os campos separados, exmplo...
jogos->
numero1 = "01"
numero2 = "03"
numero3= "15"
....
numero12 = "59"
e tentar fzar um
where("01").
where("15).
etc...
nao funcionou!!
qm puder!! eu ja agradeço!!
Obg!!!
Reunix
Post mais votado
28/05/2020
Estava olhando na documentação do Firebase e whereArrayContainsAny faz uma citação de lista no valor
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#public-query-wherearraycontainsany-fieldpath-fieldpath,-list-extends-object-values
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContainsAny(com.google.firebase.firestore.FieldPath,%20java.util.List%3C?%20extends%20java.lang.Object%3E)
Pesquisei whereArrayContainsAny no gitHub e aparentemente os códigos que encontrei estão passando um array no valor de pesquisa.
https://github.com/search?q=whereArrayContainsAny&type=Code
Essa questão que você apresentou é um dificuldade que eu também já tive e precisei fazer uma porção de loop no Function do Firebase. Se você conseguir resolver o problema posta para compartilhar a solução.
Poste essa problemática no Stack Overflow se você conseguir se expressar bem, pode ser que a tua pergunta seja bem avaliada.
Kleber Santos
Mais Posts
27/05/2020
Kleber Santos
O Firebase é um banco de dados NoSQL, e não é normalizado igual aos relacionais.
Você precisa simplificar essa consulta duplicando os dados, por exemplo:
exemplo banco relacional:
TABELA DE CATEGORIA DE JOGO id: '1' titulo: jogos de guerra: faixaetaria: 18 id: 2 titulo: jogos de corrida faixaetaria: 15 TABELAS DE JOGOS id: 11 nome: tiro ao alvo idcategoria: 1 id 12 nome corrida maluca idcategoria: 2
Mesmo exemplo no NoSQL:
TABELA DE JOGOS id: 11 nome: tiro ao alvo categoria: { id: '1' titulo: jogos de guerra: faixaetaria: 18 } id 12 nome corrida maluca idcategoria: { id 12 nome corrida maluca idcategoria: 2 }
Perceba que eu desnormalizo a estrutura do relacional para ter a menor quantidade possível de relacionamentos no NoSQL
Pesquise sobre modelagem de bancos NoSQL
Agora se mesmo assim você precisa fazer consultas contendo um valor em strings ou arrays você vai ter que estudar alguma biblioteca de terceiro que vai tratar os seus dados em um servidor antes de enviar para o cliente, para esse caso pesquise sobre ElasticSearch e abaixo tem um link do Firebase sobre:
https://firebase.google.com/docs/firestore/solutions/search
27/05/2020
Kleber Santos
supondo que você está separando por categoria:
JOGOS:
id="fsa134r1341312f3134fh1jh" categoria= "01, 03" ... id="fsaSSSSSSSSh" categoria= "01, 02" ... id="fAAAAAAAAAh" categoria = "02" ...
CATEGORIAS:
id: 1 titulo: ação idjogos: fsa134r1341312f3134fh1jh, fsaSSSSSSSSh ... id: 2 titulo: aventura idjogos: fsaSSSSSSSSh, fAAAAAAAAAh ... id: 3 titulo: corrida idjogos: fsa134r1341312f3134fh1jh ....
Perceba que eu repeti as informações nos dois documentos, a vantagem que a pesquisa fica bem simplificada pois o relacionamento já está armazenado em ambos os documentos. Porem perceba que quando alterar a categoria de um jogo você vai precisar alterar os arrays das categorias e o array do jogo,
Por isso que o NoSQL não garante nativamente as propriedades ACID, você precisa garantir através de boas práticas de programação.
28/05/2020
Reunix
supondo que você está separando por categoria:
JOGOS:
id="fsa134r1341312f3134fh1jh" categoria= "01, 03" ... id="fsaSSSSSSSSh" categoria= "01, 02" ... id="fAAAAAAAAAh" categoria = "02" ...
CATEGORIAS:
id: 1 titulo: ação idjogos: fsa134r1341312f3134fh1jh, fsaSSSSSSSSh ... id: 2 titulo: aventura idjogos: fsaSSSSSSSSh, fAAAAAAAAAh ... id: 3 titulo: corrida idjogos: fsa134r1341312f3134fh1jh ....
Perceba que eu repeti as informações nos dois documentos, a vantagem que a pesquisa fica bem simplificada pois o relacionamento já está armazenado em ambos os documentos. Porem perceba que quando alterar a categoria de um jogo você vai precisar alterar os arrays das categorias e o array do jogo,
Por isso que o NoSQL não garante nativamente as propriedades ACID, você precisa garantir através de boas práticas de programação.
Olá Kleber, obrigado por responde, entendo da necessidade, vantagens e utilizo a Desnormalização.
Porém mesmo assim continua questão, vou tentar explicar com ele realmente funciona ou deve funcionar....
é um app de jogo normal sorteio uma cartela de 12 números que estão no banco
como coloquei no exemplo anterior:
jogo = "01, 03, 15, 28, 37, 39, 42, 46, 51, 55, 58, 59"
jogo = "03, 08, 17, 25, 29, 41, 45, 47, 49, 52, 55, 57"
jogo = "06, 13, 15, 25, 37, 39, 40, 42, 50, 52, 57, 60"
daí o que preciso é utilizar algum filtro que na API ou uma sugestão de como poderia resolver de outra for, que não tenha que utilizar código java
como um foreach e ter que tratas os dados na mão, preciso do filtro mesmo..
filtro esse que vou procurar com uma String de 6 números :
jogada = "17, 29, 41, 45, 52, 57" (registro do meio la em cima)
utilizando os funções da API aparentemente não me resolvem.
whereArrayContains , esse quando utilizo só posso utilizar enviando somente um parâmetro ou seja, um único número, ( não permite fazer
uso da função aninhado para enviar os 6 números exemplo:
whereArrayContains("jogo","17"). whereArrayContains("jogo","27").whereArrayContains("jogo","29")........
Resolveria meu caso caso aceitasse!!!
whereArrayContainsAny, esse posso enviar vário números (pensei que resolveria) porém , ele me trás na pesquisa registros que contenham, alguns
dos números, ou seja se contem pelo menos 1 dos 6 números entre os 12 (mesmo que os outros 5 sejam diferentes) ele me retorna na consulta!!
daí não pode... só preciso do registro caso contenha os 6 números entre os 12 (registros)
No Mysql eu faria com LIKE "%17%" OR LIKE "%27%" OR LIKE "%48%" ....
espero ter conseguido expressar melhor!!
Agradeço novamente pela atenção, ainda estou a procura da solução, pra não ter q migrar tudo pro Mysql inclusive, código Java!
Obrigado!!
28/05/2020
Reunix
Estava olhando na documentação do Firebase e whereArrayContainsAny faz uma citação de lista no valor
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#public-query-wherearraycontainsany-fieldpath-fieldpath,-list-extends-object-values
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContainsAny(com.google.firebase.firestore.FieldPath,%20java.util.List%3C?%20extends%20java.lang.Object%3E)
Pesquisei whereArrayContainsAny no gitHub e aparentemente os códigos que encontrei estão passando um array no valor de pesquisa.
https://github.com/search?q=whereArrayContainsAny&type=Code
Essa questão que você apresentou é um dificuldade que eu também já tive e precisei fazer uma porção de loop no Function do Firebase. Se você conseguir resolver o problema posta para compartilhar a solução.
Poste essa problemática no Stack Overflow se você conseguir se expressar bem, pode ser que a tua pergunta seja bem avaliada.
Boa tarde, valeu Kleber!!
vou da uma olhadas nos links, realmente o whereArrayContainsAny posso passar um array, porém como eu disse, ele pegar se conter alguns dos números,
eu preciso que somente os que contenham os 6!! complicado isso, pensando seriamente em voltar pro Mysql kkkkkkk
Obg!!!
28/05/2020
Reunix
Estava olhando na documentação do Firebase e whereArrayContainsAny faz uma citação de lista no valor
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#public-query-wherearraycontainsany-fieldpath-fieldpath,-list-extends-object-values
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#whereArrayContainsAny(com.google.firebase.firestore.FieldPath,%20java.util.List%3C?%20extends%20java.lang.Object%3E)
Pesquisei whereArrayContainsAny no gitHub e aparentemente os códigos que encontrei estão passando um array no valor de pesquisa.
https://github.com/search?q=whereArrayContainsAny&type=Code
Essa questão que você apresentou é um dificuldade que eu também já tive e precisei fazer uma porção de loop no Function do Firebase. Se você conseguir resolver o problema posta para compartilhar a solução.
Poste essa problemática no Stack Overflow se você conseguir se expressar bem, pode ser que a tua pergunta seja bem avaliada.
Coloquei no stackoverflow
https://pt.stackoverflow.com/questions/454405/como-filtar-no-firabase-fazendo-um-like-01-and-like-11
Boa tarde, valeu Kleber!!
vou da uma olhadas nos links, realmente o whereArrayContainsAny posso passar um array, porém como eu disse, ele pegar se conter alguns dos números,
eu preciso que somente os que contenham os 6!! complicado isso, pensando seriamente em voltar pro Mysql kkkkkkk
Obg!!!
Clique aqui para fazer login e interagir na Comunidade :)