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" . Tak dataSnapshot dane dataSnapshot będą zawierać wszystkie dane w nim zawarte, w tym wszystkie dane "users" i dane "books" .

  • FirebaseDatabase.getInstance().getReference("users") i FirebaseDatabase.getInstance().getReference().child("users")

    będzie mieć ten sam wynik, wskazując na "your-project-name/users"

  • FirebaseDatabase.getInstance().getReference("users/randomUserId1") i FirebaseDatabase.getInstance().getReference().child("users/randomUserId1") i FirebaseDatabase.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)



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow