Olá Uiratan, tudo bem?
Conversei com a equipe sobre o tópico que você criou e um colega de trabalho que manja muito de Firebase, o Ricarth Lima, analisou sua dúvida e disponibilizou o direcionamento que vou te passar a seguir.
Vamos lá!
- O Firebase tem dois bancos de dados online NoSQL em tempo real:
- Cloud Firestore: Mais novo, mais bem estruturado, mais suportes à região, mais bibliotecas de integração etc; e o
- Realtime Database: O que você usou, que realmente segue a estrutura de um JSON, e provavelmente por essa característica você resolveu usar esse banco.
Realtime Database x JSON
Você notou uma peculiaridade: apesar de seguir a estrutura de um JSON, o Realtime Database não é de fato um JSON:
No JSON podemos fazer, por exemplo, a atribuição: chave, valor. O que não é possível no Realtime Database que só aceita esses tipos de valores:
Portanto, quando ele importa o db.json
que contem uma lista, essa lista é convertida para um Map onde cada chave é uma String que “itera” sob a ordem universal de 0,1,2,3…, e o valor é um Map contendo o valor do respectivo índice;
Como tentar converter uma lista para um dicionário?
Daí, acredito que o maior desafio é adaptar o código para seguir essa lógica: precisamos garantir a consistência entre o campo id
da classe Pensamentos
e a chave que representa esse pensamento no Realtime Database.
Mão na massa
A melhor solução (ponderando complexidade e assertividade) é reestruturar a aplicação para não mais usar o campo “id” como fonte da informação do id, e sim a chave no Realtime Database.
A aplicação teria que gerenciar isso, pois o Realtime Database não tem essa inteligência.
Lendo, Editando ou Removendo por Id
Ou seja, ao ler, editar ou remover um Pensamento, você vai ter que olhar qual o id que está registrado localmente no atributo e fazer essa chamada para o Realtime Database.
Algo como:
- getAllPensamentos:
http.get('$url/pensamentos.json')
- getPensamentoById:
http.get('$url/pensamento/id.json')
- editPensamento:
http.put('$url/pensamento/id.json')
- removerPensamento:
http.delete('$url/pensamento/id.json')
Mas acredito que isso você já fez, o segredo está na hora de adicionar.
Adicionando com Id
É necessário que você faça as adições seguindo a lógica da lista e crie (primeiro localmente) um novo Pensamento onde o id
seja a posição na lista. Tipo assim:
- addPensamento:
http.put('$url/pensamento/id.json')
- Aqui vai ter que usar um PUT ao invés de um POST mesmo para adicionar, pois, por padrão, o Realtime Database adicionaria com um uuid aleatório (como você mesmo notou), é uma lógica similar a editar um map onde Adicionar e Editar é a mesma sintaxe.
Não adianta, se você usa o POST para adicionar em qualquer nível no Realtime Database ele cria um id aleatório, que para nosso caso aqui quebra toda a lógica do sistema. O PUT é a solução, já que caso você tente “editar” algo que não existe ele simplesmente cria com o ID que você passou.
De resto, é implementar no código a consistência entre o campo id
da classe Pensamento
, e a chave Id do Realtime Database, pois essa lógica de ids (que possuem ordem entre si) via numeração agora vai ter que ser implementada no código.
Sobre o problema na importação, você pode simplesmente não importar o db.json
e começar do zero o banco no Realtime Database. Ou pode adicionar (por escrito no bloco de notas mesmo) um primeiro objeto com id 0 antes de importar o db.json
.
Segue a documentação do Firebase utilizada como referência
Espero que te ajude, abraços, bons estudos!