Meilleure façon de récupérer/format de données à l'aide de Firebase API Java
Je suis en utilisant Firebase
pour le stockage de données sur un Android
projet, et à l'aide de la Firebase Java API
traiter les données. Je ne suis pas sûr que je vais le faire de manière aussi efficace que possible, bien que, et j'aimerais avoir quelques conseils sur les meilleures pratiques pour la récupération et la mise en forme des données. Mon Firebase
référentiel ressemble à quelque chose comme ça....
-POLLS
NUMPOLLS - 5
(pollskey) - NAME - Poll1
NUMELECTIONS - 2
ELECTIONS
(electionskey) - NAME - Election1
NUMNOMINATIONS - 2
NUMVOTERS - 2
NUMBERTOELECT - 1
VOTERS - (votesrkey) - NAME - Charles
NUMBER - (678) 333-4444
.
.
.
(voterskey) - ...
NOMINATIONS - (nominationskey) - NAME - Richard Nixon
NUMBEROFVOTES - 2
.
.
.
(nominationskey) - ...
.
.
.
(electionskey) - ...
.
.
.
(pollskey) - ...
Ainsi, par exemple ici, je vais essayer d'obtenir toutes les données d'un scrutin de liste du sondage nom, c'est l'élection des noms, et le candidat noms et le nombre des suffrages à chaque élection. Je reçois les SONDAGES niveau DataSnapshot
au cours de la OnCreate()
fonction de mon activité principale c'est comme ça...
private static final Firebase polls = pollsFirebase.child("Polls");
protected void onCreate(Bundle savedInstanceState) {
polls.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot child : snapshot.getChildren()) {
if (!child.getName().equals("NumPolls")) {
createPollTableAndHeaders(child);
}
}
}
});
}
Puis-je procéder à la lecture de chacun des éléments de données dont j'ai besoin successivement appel getValue()
sur DataSnapshots
, et de vérifier les clés de la HashMaps
...
private void createPollTableAndHeaders(DataSnapshot poll) {
String pollName = "";
int numPolls;
Object p = poll.getValue();
if (p instanceof HashMap) {
HashMap pollHash = (HashMap) p;
if (pollHash.containsKey("Name")) {
pollName = (String) pollHash.get("Name");
}
if (pollHash.containsKey("Elections")) {
HashMap election = (HashMap) pollHash.get("Elections");
Iterator electionIterator = election.values().iterator();
while (electionIterator.hasNext()) {
Object electionObj = electionIterator.next();
if (electionObj instanceof HashMap) {
HashMap electionHash = (HashMap) electionObj;
if (electionHash.containsKey("Name")) {
String electionName = (String) electionHash.get("Name");
}
}
};
}
}
Cela semble assez fastidieux façon de percer vers le bas à travers la structure de données, et je me demandais si il ya une meilleure façon.
J'ai vu le getValue(java.lang.Class<T> valueType)
méthode dans la documentation, mais je n'ai pas été en mesure de le faire fonctionner dans mon cas, depuis que je travaille avec composé des objets, et pas seulement des conteneurs pour les types primitifs. Comment fonctionne la fonction de savoir ce que Firebase
de données pour attribuer à laquelle les variables d'un objet de modèle? Est-elle adaptée Firebase
clé de noms de variables membres, et donc ceux-ci doivent être exactement la même, la sensibilité à la casse? Comment traiter avec Firebase
clé générée par des noms comme produit lorsque le poussant à un List
? Comment construire des objets de modèle pour les composés objets?
OriginalL'auteur MassStrike | 2013-07-29
Vous devez vous connecter pour publier un commentaire.
La
getValue(java.lang.Class valueType)
méthode suit les mêmes règles que les jackson mappage d'objets de la bibliothèque (c'est ce que nous utilisons en interne: http://wiki.fasterxml.com/JacksonInFiveMinutes). Ainsi, vos classes Java doit avoir constructeurs par défaut (sans argument) et des getters pour les propriétés que vous voulez attribuer (https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html#getValue(java.lang.Class)).En bref, oui, les noms de clé dans Firebase doivent correspondre aux variables membres.
Pour un exemple d'utilisation des objets composites, y compris une liste, voir AndroidDrawing. Plus précisément, le
Segment
classe contient une liste dePoint
instances. Il y a un piège à l'aide de listes de données générées avec le.push()
méthode. Depuis les noms de clés générées sont des Chaînes de caractères afin qu'ils puissent être unique sur l'ensemble des clients, qu'ils désérialiser leMap
s plutôt que deList
s. Toutefois, si vous parcourezdataSnapshot.getChildren()
ils seront retournés dans l'ordre.En outre, si vous ne voulez pas désérialiser dans une table de hachage, vous pouvez utiliser la méthode child() sur DataSnapshot. Par exemple:
Dans cet exemple, toutes les valeurs qui n'existent pas seront retournées comme
null
.Espère que ça aide!
Ok cool, c'est tout ce dont j'ai besoin pour commencer. Merci Greg, pour apprécier de l'aide rapide.
Désolé de faire remonter un vieux thread, mais je suis en utilisant GeoFire avec Firebase et la Géolocalisation de la classe ne fournit pas de constructeur par défaut. Alors, comment dois-je procéder pour désérialiser ce type de classe ? Est-il deserializer usine embeded? Merci !
OriginalL'auteur Greg Soltis
T public getValue(Classe valueType)
1.La classe doit avoir un constructeur par défaut qui ne prend pas d'arguments
2.La classe doit définir publique getters pour les propriétés à être cédés. Propriétés sans un getter public sera mis à leur valeur par défaut lorsqu'une instance est désérialisé
Le vérifier à partir de:
cette source Il va vous aider à
détail
OriginalL'auteur Hoa Nguyen