2017-05-10 1 views
0

Solution: Comme Frank l'indique déjà, j'ai dû créer un fichier séparé pour que ce tri fonctionne. Comme l'a suggéré, j'ai créé un dépôt « sortField » qui combine laFirebase orderByChild (1) et filtrer par l'enfant deux solutions?

"clubKey" + "_" + "startDate" 

Pour modifier mes ensembles de données existants, j'ai fait une fonction de script java rapide comme ceci:

function createTestDataSet(){ 
    evd = dbAllEventsListRef; 

    evd.on('child_added', function(snap, previous){ 
     console.log(snap.val()); 
     data = snap.val(); 
     data.sortField = data.clubKey + "_" + data.startDate; 
     testDiv = document.getElementById("divCarSummary"); 
     testDiv.innerHTML = testDiv.innerHTML + "<br/>"+data.sortField; 
     evd.child(snap.key).set(data); 
    }); 
} 

Je l'ai testé cela en utilisant les éléments suivants Code:

function testSort(){ 
    key = "manualClubKey-1"; 
    testEvents = dbTesting.child('eventList').orderByChild("sortField").startAt(key+"_").endAt(key+"a"); 
    testEvents.on('child_added', function(snap, previous){ 
     data = snap.val(); 
     testDiv = document.getElementById("divCarSummary"); 
     testDiv.innerHTML = testDiv.innerHTML + "<br/>"+data.startDate+", "+data.name+", "+snap.key+", "+data.clubKey; 

     console.log(snap.val()); 
    }); 
} 

la partie la plus délicate était, que le manuel pour "ENDAT" déclare:

The ending point is inclusive, so children with exactly the specified value will be included in the query 

Mais cela ne semble pas être vrai. Si je donne la même valeur pour startAt() et endAt(), je n'obtiens aucun résultat. J'ai donc modifié la requête, que je recherche le "clubKey" + le séparateur. Pour le séparateur, j'ai donné un personnage juste après le "_". ainsi cela fonctionne comme un charme.

J'ai modifié mon code android, de sorte que chaque fois que le startDate, ou le clubKey est écrit, je mets à jour le "sortFiled", petit changement, fonctionne comme un charme.

Question d'origine J'ai quelques données d'événement. données de l'échantillon:

{ 
    "modeltruckerManualEventID-96" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-1", 
    "endTime" : "17:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2012-06-17", 
    "startTime" : "10:00:00" 
    }, 
    "modeltruckerManualEventID-97" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-2", 
    "endTime" : "17:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2012-06-17", 
    "startTime" : "10:00:00" 
    }, 
    "modeltruckerManualEventID-98" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-2", 
    "endTime" : "16:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2012-03-11", 
    "startTime" : "10:00:00" 
    }, 
    "modeltruckerManualEventID-99" : { 
    "canceled" : false, 
    "clubKey" : "manualClubKey-1", 
    "endTime" : "16:00:00", 
    "eventOpenForWeightData" : false, 
    "link" : "", 
    "locationID" : "manualLocationID-4", 
    "name" : "Fahrtag TuHaKi", 
    "startDate" : "2011-11-27", 
    "startTime" : "10:00:00" 
    } 
} 

Je veux maintenant filtrer, donc je n'obtenir des événements d'un « clubKey » que je pouvais réaliser en utilisant:

.orderByChild("clubKey").equalTo("manualClubKey-1") 

Cela fonctionne très bien.

Mais y a-t-il un moyen, que je peux commander les résultats aussi par l'enfant "startDate"?

Je souhaite donc que les résultats filtrés soient classés par startDate enfin. Pour autant que je sache, cela ne fonctionne pas. J'utilise Firebase sur Android avec Firebase UI.

Des idées comment y parvenir?

Je ne souhaite pas restructurer les données ou les dupliquer davantage.

Espérons qu'il y a un moyen, peut-être forcer la commande déjà sur le stockage?

+0

Vous devez soit commander le côté client de données ou créer une propriété qui combine les valeurs de 'clubKey' et 'startDate'. Par exemple: '" clubKey_startDate ":" manualClubKey-1_2011-11-27 "'. Voir http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

+0

Merci, mais je ne vois pas, comment puis-je obtenir tout "manualClubKey-1" avec n'importe quel startDate , mais commandé par startDate. Ou y at-il un truc en utilisant startAt et endAt. Sur le lien donné, je n'ai pas vu une solution à mon problème, où il semble être similaire. –

+0

Votre question semblait être comment obtenir des utilisateurs avec 'club ==" manualClubKey-1 "' ordre par 'startDate'. Vous aurez besoin de créer une propriété composite pour cela, puis 'ref.orderByChild (" clubKey_startDate "). StartAt (" manualClubKey-1 "). EndAt (" manualClubKey-2 ")' –

Répondre

0

Si vous voulez commanderByChild (especificdate), ce n'est pas possible sans restructurer les données.

Cependant, permet de dire que vous voulez obtenir les nœuds dernière ajoutés, il suffit d'utiliser limitToLast (numberOfChildren)