La récupération de données à partir de Firebase en temps réel de la Base de données sous Android
Je suis nouveau sur Firebase et NoSQL. J'ai un Android Démo, avec une Ville de saisie semi-automatique de Champ de Texte dans lequel je veux peupler les villes que j'ai depuis mon Firebase DB, tout en tapant.
{ "cities":{
"Guayaquil":true,
"Gualaceo":true,
"Quito":true,
"Quevedo":true,
"Cuenca":true,
"Loja":true,
"Ibarra":true,
"Manta":true
}
}
C'est ce que j'ai jusqu'à présent.
Comment puis-je récupérer à partir de la DB villes qui commencent par une lettre (de saisie au clavier)? Si je commence à taper "G", je veux recevoir "Guayaquil" et "Gualaceo".
Si j'utilise orderByValue
retourne toujours un vide instantané.
Si j'utilise orderByKey
retour de l'ensemble de la liste.
Query citiesQuery = databaseRef.child("cities").startAt(input).orderByValue();
citiesQuery.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> cities = new ArrayList<String>();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
cities.add(postSnapshot.getValue().toString());
}
Remarque: Si vous pouvez recommander une meilleure structure de données, vous êtes les bienvenus.
Quelles sont les dimensions de cette base de données des villes? Serait-il plausible pour votre application de lecture dans la base de données une fois dans une copie locale (comme un tableau de quelque sorte), puis utiliser la logique pour afficher uniquement les valeurs appropriées tout en tapant?
Initialement, il sera autour de 10, mais vous pouvez l'augmenter jusqu'à 100.Je voulais que cette fonctionnalité soit "en ligne", donc je ne peux ajouter de nouvelles villes sans avoir besoin de les stocker localement
Oh c'est bon. Aussi loin que le processeur et réseau de 100 petites chaînes est pratiquement rien, donc il va certainement être rapide. Permettez-moi de clarifier ce que je veux dire par les stocker localement. Je veux dire dans la mémoire lors de l'exécution, c'est tout. Je ne veux pas dire stocker une copie dans les dispositifs de stockage ou quelque chose comme ça. Tout ce que je veux dire c'est, lisez les villes dans un tableau et ensuite travailler avec ce tableau pour afficher les données. Lorsque les modifications de base de données, vous pouvez très facilement mettre à jour le tableau presque instantanément, mais je doute que cela va changer souvent. Découvrez ma réponse pour une explication un peu plus de ce que je pensais.
Comme une note, dans ma réponse, vous pouvez prendre le mot "unique" de l'écouteur d'événement et qui permettra de faire en temps réel. Puis il suffit d'ajouter cityList.clear() avant la boucle et puis à chaque fois que vos modifications de base de données l'ensemble de votre liste de tableaux sera actualisé.
Initialement, il sera autour de 10, mais vous pouvez l'augmenter jusqu'à 100.Je voulais que cette fonctionnalité soit "en ligne", donc je ne peux ajouter de nouvelles villes sans avoir besoin de les stocker localement
Oh c'est bon. Aussi loin que le processeur et réseau de 100 petites chaînes est pratiquement rien, donc il va certainement être rapide. Permettez-moi de clarifier ce que je veux dire par les stocker localement. Je veux dire dans la mémoire lors de l'exécution, c'est tout. Je ne veux pas dire stocker une copie dans les dispositifs de stockage ou quelque chose comme ça. Tout ce que je veux dire c'est, lisez les villes dans un tableau et ensuite travailler avec ce tableau pour afficher les données. Lorsque les modifications de base de données, vous pouvez très facilement mettre à jour le tableau presque instantanément, mais je doute que cela va changer souvent. Découvrez ma réponse pour une explication un peu plus de ce que je pensais.
Comme une note, dans ma réponse, vous pouvez prendre le mot "unique" de l'écouteur d'événement et qui permettra de faire en temps réel. Puis il suffit d'ajouter cityList.clear() avant la boucle et puis à chaque fois que vos modifications de base de données l'ensemble de votre liste de tableaux sera actualisé.
OriginalL'auteur Erick Medina | 2016-09-27
Vous devez vous connecter pour publier un commentaire.
@NicholasChen a identifié le problème. Mais ici, c'est la façon dont vous vous mettriez à l'aide de la 3.x SDK:
En commençant à l'entrée de l'utilisateur et se terminant à la dernière chaîne qui commence avec l'entrée de l'utilisateur, vous obtenez tous les éléments correspondants
Pour une période relativement courte de la liste des éléments de Ryan approche fonctionne également très bien. Mais le au-dessus de Firebase requête filtre côté serveur.
Mise à jour
J'ai juste couru ce code:
Et de l'imprimer:
Donc clairement correspond à deux villes.
Hésitez pas à tester par rapport à ma base de données: https://stackoverflow.firebaseio.com/39714936
J'ai testé et cela fonctionne pour moi. J'ai ajouté le complet extrait et un lien vers ma base de données à la question.
Je l'ai testé et il fonctionne parfaitement
OriginalL'auteur Frank van Puffelen
Essayer quelque chose de ce genre pour itérer sur les enfants dans le
cities
instantané et ajouter toutes les villes d'uneArrayList
deStrings
.Édition de ce paragraphe pour plus de clarté:
Cela permettra d'obtenir toutes les villes de votre lecture dans la mémoire de programme de sorte que vous pouvez utiliser ces données pour afficher les villes à l'utilisateur. Si la ville modifications de la liste, de sorte que les données de l'utilisateur voit. Si l'utilisateur n'est pas en ligne, cela ne marchera pas. Cela met un temps réel, en ligne seul auditeur sur la base de données.
La logique dans mon esprit, c'est quelque chose comme:
qui commencent par la même chaîne qui a été tapé.
J'espère que cela va vous mettre sur la bonne voie. Je suis sûr qu'il y a d'autres manières que vous pourriez mettre en œuvre mais c'est ce que je serais personnellement faire. Si vous avez besoin d'aide avec le code pour afficher la corriger villes, démarrer une conversation avec moi et je peux réfléchir avec vous.
Il serait encore en ligne, la façon dont je le fais. Peu importe ce que vous faites, vous allez avoir à lire des données dans une variable à un moment ou à votre application ne sera pas en mesure d'afficher le nom de la ville. Il serait encore en charge la supprime et si quelqu'un supprime une ville alors qu'un autre utilisateur est en train de taper, il serait encore de mise à jour de l'autre la liste des utilisateurs lors de la frappe. Je pense que je pourrais peut être expliquer à l'auditeur de mal, ou peut-être je suis juste de l'incompréhension des exigences.
Je suppose que votre approche est correcte. Mais le mi idée était d'envoyer Firebase les premières lettres d'une ville, et dans l'Instantané, obtenir la liste seulement les villes qui commencent par ces lettres.
Je pense que Ryan a donné la bonne solution. Vous avez juste besoin de connecter ce tableau à votre saisie semi-automatique et lorsque vous ajoutez des données en ligne il sera simplement mis à jour dans votre liste de tableau. Si vous ne comprenez pas le concept d'auditeurs, alors je vous suggère de passer par firebase docs et essayer les exemples donnés pour obtenir de la nourriture de la compréhension de l'essentiel.
Vous pourriez le faire, mais personnellement, je pense que l'ajout de l'écouteur d'événement serait plus facile. Surtout avec une petite liste. Un problème que je vois avec votre approche est mineur, le réseau de soubresauts. Si leur relation est inégale tous ces appels à chaque lettre type peut être perceptible. Encore certainement faisable tho. Si je n'étais pas en tapant sur mon petit téléphone portable, juste maintenant, je voudrais venir avec un bloc de code pour votre approche lol. Ne peut pas gérer sur mon téléphone tho.
OriginalL'auteur Ryan
Bien sûr OrderByValue ne retourne rien, parce que c'est la booléens vous avez.
vous pouvez utiliser le startAt et endAt méthodes pour le faire. (Le dessous est Firebase 2.0 Code de l')
Vous pouvez explorer plus sur le Firebase 3 site de documentation ici.
Ce que Ryan n'avait droit. Cependant, vous avez à mettre en œuvre startAt sur le dataSnapshot à assurez-vous que votre "live" des travaux de recherche.
C'est pourquoi c'est marqué dans Android??
Je ne pense pas que vous utilisez startAt avec ma méthode parce que je suis mot de l'exécution d'une requête, je suis l'affectation d'un temps réel de l'auditeur à l'écoute pour toute modification de la base de données.
OriginalL'auteur Nicholas