ios - orderbykey - query firebase android
Cómo recuperar datos múltiples en una consulta Firebase (1)
Soy nuevo en firebase y nosql. Seguí la guía para estructurar los datos y aquí está lo que parecen mis datos
{"Guardians" : {
"jojo-pti-gros" : {
"-KBT2ui6wlC6Fgk1c7Xa" : {
"creationDate" : "2016-02-26 15:50:56",
"level" : "2",
"light" : "2",
"type" : "Titan"
}
}
},
"Players" : {
"jojo-pti-gros" : {
"console" : "PS4",
"creationDate" : "2016-02-26 15:50:39",
"currentGuardian" : "-KBT2ui6wlC6Fgk1c7Xa",
"email" : "[email protected]",
"gamertag" : "jojo-pti-gros",
"guardians" : {
"-KBT2ui6wlC6Fgk1c7Xa" : "true"
}
}
},
"Teams" : {
"-KBhfH9U3CxQPZiCs5ru" : {
"activity" : "Raid - Normal - Crota''s end",
"creationDate" : "2016-02-29 16:37:14",
"language" : "Any language",
"leader" : "jojo-pti-gros",
"maxPlayers" : "6",
"mic" : "true",
"minimumLight" : "55",
"players" : {
"jojo-pti-gros" : "true"
},
"teamDescription" : "Chaud pour un raid"
}
}}
Cuando trato de recuperar un equipo, me gustaría tener un JSON como este.
"-KBhfH9U3CxQPZiCs5ru" = {
activity = "Raid - Normal - Crota''s end",
creationDate = "2016-02-29 16:37:14",
language = "Any language",
leader = "jojo-pti-gros",
maxPlayers = 6,
mic = true,
minimumLight = 55,
players = {
"jojo-pti-gros" = {
"creationDate" = "2016-02-26 15:50:56",
"level" = "2",
"light" = "2",
"type" = "Titan"
}
},
teamDescription = "Chaud pour un raid"
}
Pero tengo este json en su lugar
"-KBhfH9U3CxQPZiCs5ru" = {
activity = "Raid - Normal - Crota''s end",
creationDate = "2016-02-29 16:37:14",
language = "Any language",
leader = "jojo-pti-gros",
maxPlayers = 6,
mic = true,
minimumLight = 55,
players = {
"jojo-pti-gros" = true
},
teamDescription = "Chaud pour un raid"
}
Mi código ahora
let fb = Firebase(url:myUrl)
fb.childByAppendingPath("/Teams").observeSingleEventOfType(.Value, withBlock: { teams in
var teamsArray: [Team] = []
if (teams.value is NSNull) {
print("no teams found")
} else {
print(teams.value)
for team in teams.value as! NSDictionary {
let newTeam = Team()
newTeam.dictionaryToTeam(team.value as! NSDictionary)
newTeam.id = String(team.key)
for player in newTeam.playerDictionary as NSDictionary {
GuardianAPI.sharedInstance.getGuardianByGamertagAndID(player.key as! String, id: player.value as! String, handler: {newGuardian in
newTeam.playerDictionary.setValue(newGuardian, forKey: player.key as! String)
})
}
teamsArray.append(newTeam)
}
handler(true)
}
})
No sé cómo hacer una consulta con juntura como SQL. ¿Alguien sabe cómo resolver esto?
Hay un par de instrucciones para ir con esto.
Una opción es leer en el nodo del equipo, separar los refs del jugador en quizás una matriz y luego iterar sobre la matriz para obtener la referencia de cada jugador y cargar cada jugador con una llamada separada de Firebase.
Una mejor opción es almacenar una referencia de vuelta al equipo en el nodo de cada jugador
"Players" : {
"jojo-pti-gros" : {
team: "-KBhfH9U3CxQPZiCs5ru"
}
Observe el nodo de equipos para cargar los datos del equipo y luego consulte el nodo de jugadores para todos los jugadores que tengan un hijo: team = "-KBhfH9U3CxQPZiCs5ru"
Firebase *playersRef = [myRootRef childByAppendingPath:@"Players"];
FQuery *query1 = [playersRef queryOrderedByChild:@"team"];
FQuery *query2 = [query1 queryEqualToValue:@"-KBhfH9U3CxQPZiCs5ru"];
[query2 observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
NSLog(@"key: %@ %@", snapshot.key, snapshot.value);
}];
El resultado será una instantánea llena de todos los jugadores que pertenecen al equipo.