Query Firebase Java Android

26/05/2020

6

Olá pessoal boa noite!"!!

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!!!
Responder

Post mais votado

28/05/2020

Reunix, agora ficou mais claro o problema

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.
Responder

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
Responder

27/05/2020

Kleber Santos

Analisando especificamente o teu exemplo eu modelaria o BD NoSQL da seguinte maneira:

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.
Responder

28/05/2020

Reunix

Analisando especificamente o teu exemplo eu modelaria o BD NoSQL da seguinte maneira:

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!!








Responder

28/05/2020

Reunix

Reunix, agora ficou mais claro o problema

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!!!

Responder

28/05/2020

Reunix

Reunix, agora ficou mais claro o problema

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!!!

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar