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å dataSnapshot du skaffat kommer att innehålla all data inuti den, inklusive all "users" -data och "books" -data.

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

    kommer att ha samma resultat och pekar på "your-project-name/users"

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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow