firebase-database
Läser data
Sök…
Förstå vilka data som refereras av getReference ()
I det här exemplet använder vi den här databasen:
"your-project-name" : {
"users" : {
"randomUserId1" : {
"display-name" : "John Doe",
"gender" : "male"
}
"randomUserId2" : {
"display-name" : "Jane Dae",
"gender" : "female"
}
},
"books" {
"bookId1" : {
"title" : "Adventure of Someone"
},
"bookId1" : {
"title" : "Harry Potter"
},
"bookId1" : {
"title" : "Game of Throne"
}
}
}
Om du använder databasen ovan:
FirebaseDatabase.getInstance().getReference()kommer att peka på projektets förälder,
"your-project-name"-data. SådataSnapshotdu skaffat kommer att innehålla all data inuti den, inklusive all"users"-data och"books"-data.FirebaseDatabase.getInstance().getReference("users")ochFirebaseDatabase.getInstance().getReference().child("users")kommer att ha samma resultat och pekar på
"your-project-name/users"FirebaseDatabase.getInstance().getReference("users/randomUserId1")ochFirebaseDatabase.getInstance().getReference().child("users/randomUserId1")ochFirebaseDatabase.getInstance().getReference().child("users").child("randomUserId1")kommer att ha samma resultat och pekar på
"your-project-name/users/randomUserId1"
Obs: detta exempel behövs för att fullt ut förstå vilka data som finns i dataSnapshot-objektet
Förstå vilka data som finns i dataSnapshot-objektet
Obs: Du måste veta vilka data som refereras av getReference () först innan du helt kan förstå detta exempel.
Det finns tre vanliga metoder för att få dina data från Firebase Realtime Database:
-
addValueEventListener() -
addListenerForSingleValueEvent() -
addChildEventListener()
När vi pratar om vilka data som finns i dataSnapshot objekt, är addValueEventListener() och addListenerForSingleValueEvent() princip detsamma. Den enda skillnaden är addValueEventListener() hålla lyssna på förändringar som gjorts i de referenser som data medan addListenerForSingleValueEvent() inte är det.
Så tänk på att vi har den här databasen:
"your-project-name" : {
"users" : {
"randomUserId1" : {
"display-name" : "John Doe",
"gender" : "male"
}
"randomUserId2" : {
"display-name" : "Jane Dae",
"gender" : "female"
}
},
"books" {
"bookId1" : {
"title" : "Adventure of Someone"
},
"bookId1" : {
"title" : "Harry Potter"
},
"bookId1" : {
"title" : "Game of Throne"
}
}
}
DataSnapshot producerad av addValueEventListener och addListenerForSingleValueEvent
dataSnapshot producerad av addValueEventListener() och addListenerForSingleValueEvent() kommer att innehålla värden på exakta data som det refereras till. Precis som när ref pekar på "your-project-name" så skulle dataSnapshot vara:
... onDataChange(DataSnapshot dataSnapshot) {
dataSnapshot.getKey(); // will have value of String: "your-project-name"
for (DataSnapshot snapshot : dataSnapshot) {
snapshot.getKey(); // will have value of String: "users", then "books"
for (DataSnapshot deeperSnapshot : dataSnapshot) {
snapshot.getKey();
// if snapshot.getKey() is "users", this will have value of String: "randomUserId1", then "randomUserId2"
// If snapshot.getKey() is "books", this will have value of String: "bookId1", then "bookId2"
}
}
}
DataSnapshot producerad av addChildEventListener
dataSnapshot producerad av addChildEventListener() kommer att innehålla data (er) med data en nivå djupare inuti de data det refereras till. Som i dessa fall:
När ref pekar på "your-project-name" bör dataSnapshot vara:
... onChildAdded(DataSnapshot dataSnapshot, String s) {
dataSnapshot.getKey(); // will have value of String: "users", then "books"
for (DataSnapshot snapshot : dataSnapshot) {
snapshot.getKey();
// if dataSnapshot.getKey() is "users", this will have value of String: "randomUserId1", then "randomUserId2"
// If dataSnapshot.getKey() is "books", this will have value of String: "bookId1", then "bookId2"
for (DataSnapshot deeperSnapshot : dataSnapshot) {
snapshot.getKey();
// if snapshot.getKey() is "randomUserId1" or "randomUserId1", this will have value of String: "display-name", then "gender"
// But the value will be different based on key
// If snapshot.getKey() is "books", this will have value of String: "title", but the value will be different based on key
}
}
}
// dataSnapshot inside onChildChanged, onChildMoved, and onChildRemoved will have the same data as onChildAdded
Jag vet sannolikt att vi kommer att vilja använda .getValue() istället för getKey() . Men här använder vi getKey eftersom den alltid kommer att innehålla en sträng och inget behov av att konvertera till anpassat objekt, eller karta, eller annat. I grund och botten, när du vet vilken dataSnapshot pekar på, kan du enkelt veta vilket värde den innehåller och analysera den till ditt eget anpassade objekt (eller vad som helst)