firebase-database
Odczytywanie danych
Szukaj…
Zrozumienie danych, do których odwołuje się getReference ()
W tym przykładzie używamy tej bazy danych:
"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"
}
}
}
Jeśli korzystasz z powyższej bazy danych:
FirebaseDatabase.getInstance().getReference()wskaże dane nadrzędne twojego projektu,
"your-project-name". TakdataSnapshotdanedataSnapshotbędą zawierać wszystkie dane w nim zawarte, w tym wszystkie dane"users"i dane"books".FirebaseDatabase.getInstance().getReference("users")iFirebaseDatabase.getInstance().getReference().child("users")będzie mieć ten sam wynik, wskazując na
"your-project-name/users"FirebaseDatabase.getInstance().getReference("users/randomUserId1")iFirebaseDatabase.getInstance().getReference().child("users/randomUserId1")iFirebaseDatabase.getInstance().getReference().child("users").child("randomUserId1")będzie mieć ten sam wynik, wskazując na
"your-project-name/users/randomUserId1"
Uwaga: ten przykład jest potrzebny, aby w pełni zrozumieć, które dane znajdują się w obiekcie dataSnapshot
Zrozumienie, które dane znajdują się w obiekcie dataSnapshot
Uwaga: Musisz najpierw wiedzieć, do których danych odwołuje się getReference (), zanim w pełni zrozumiesz ten przykład.
Istnieją trzy popularne metody pobierania danych z bazy danych Firebase Realtime:
-
addValueEventListener() -
addListenerForSingleValueEvent() -
addChildEventListener()
Kiedy mówimy o tym, które dane znajdują się w obiekcie dataSnapshot , wówczas addValueEventListener() i addListenerForSingleValueEvent() są w zasadzie takie same. Jedyną różnicą jest to, że addValueEventListener() słucha zmian dokonanych w danych, do których się odwołuje, podczas gdy addListenerForSingleValueEvent() nie jest.
Rozważmy, że mamy tę bazę danych:
"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 produkowane przez addValueEventListener i addListenerForSingleValueEvent
dataSnapshot wytworzone przez addValueEventListener() i addListenerForSingleValueEvent() będzie zawierać wartości dokładnych danych, do których się odwołuje. Na przykład gdy ref wskazuje na "your-project-name" dataSnapshot powinien być:
... 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 wyprodukowany przez addChildEventListener
dataSnapshot wytworzone przez addChildEventListener() będzie zawierać wartości danych o jeden poziom głębiej w danych, do których się odwołuje. Podobnie jak w tych przypadkach:
Kiedy ref wskazuje na "your-project-name" wówczas dataSnapshot powinien być:
... 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
Wiem, że najprawdopodobniej będziemy chcieli użyć .getValue() zamiast getKey() . Ale tutaj używamy getKey ponieważ zawsze będzie on zawierał jeden ciąg i nie będzie potrzeby konwertowania go na obiekt niestandardowy, mapę lub inny. Zasadniczo, gdy wiesz, na które kluczowe dataSnapshot wskazuje dataSnapshot , możesz łatwo dowiedzieć się, jaką wartość zawiera i przeanalizować w swoim własnym obiekcie (lub cokolwiek innego)