Поиск…


Понимание данных, на которые ссылается getReference ()

В этом примере мы используем эту базу данных:

"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"
        }
    }
}

Если вы используете вышеуказанную базу данных, тогда:

  • FirebaseDatabase.getInstance().getReference()

    будет указывать на родительские данные "your-project-name" данные "your-project-name" . Таким образом, dataSnapshot вами dataSnapshot будет содержать все данные внутри него, включая все данные "users" и "books" .

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

    будет иметь тот же результат, указывая на "your-project-name/users"

  • FirebaseDatabase.getInstance().getReference("users/randomUserId1") и FirebaseDatabase.getInstance().getReference().child("users/randomUserId1") и FirebaseDatabase.getInstance().getReference().child("users").child("randomUserId1")

    будет иметь тот же результат, указывая на "your-project-name/users/randomUserId1"

Примечание: этот пример необходим, чтобы полностью понять, какие данные находятся внутри объекта dataSnapshot

Понимание того, какие данные находятся внутри объекта dataSnapshot

Примечание. Прежде чем вы сможете полностью понять этот пример, вам нужно знать, какие данные ссылаются на getReference () .

Существует три распространенных метода получения данных из базы данных Firebase Realtime:

  • addValueEventListener()
  • addListenerForSingleValueEvent()
  • addChildEventListener()

Когда мы говорим о том, какие данные находятся внутри объекта dataSnapshot , тогда addValueEventListener() и addListenerForSingleValueEvent() в основном то же самое. Единственное различие заключается в том, что addValueEventListener() продолжает прослушивать изменения, сделанные в ссылочных данных, а addListenerForSingleValueEvent() - нет.


Поэтому рассмотрим, что у нас есть эта база данных:

"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, созданный addValueEventListener и addListenerForSingleValueEvent

dataSnapshot созданный addValueEventListener() и addListenerForSingleValueEvent() будет содержать значения ( addListenerForSingleValueEvent() точных данных, на которые он ссылается. Например, когда ref указывает на "your-project-name" тогда dataSnapshot должен быть:

... 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, созданный addChildEventListener

dataSnapshot созданный addChildEventListener() будет содержать значения (ы) данных на один уровень глубже внутри данных, на которые он ссылается. Как в этих случаях:

Когда ref указывает на "your-project-name" тогда dataSnapshot должен быть:

... 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

Я знаю, скорее всего, мы захотим использовать .getValue() вместо getKey() . Но здесь мы используем getKey потому что он всегда будет содержать одну строку и не нужно преобразовывать в пользовательский объект, карту или другую. В основном, когда вы знаете, к какому ключу dataSnapshot указывает, вы можете легко узнать, какое значение оно содержит, и проанализировать его в свой собственный obeject (или что-то еще)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow