Чтение данных из базы данных Firebase

Я хочу прочитать конкретные данные из базы данных firebase. Что я сейчас делаю здесь.

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = database.child("profiles/");

myRef.child(phoneNo).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        user = dataSnapshot.getValue(User.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}

});

enter image description here

метод для записи в DB

public void writeToDBProfiles(Object data,String phoneNo) {
    DatabaseReference database = FirebaseDatabase.getInstance().getReference();
    DatabaseReference myRef = database.child("profiles/" + phoneNo);
    myRef.setValue(data);
}

но его возвращение null... Любая помощь будет оценена.

4 ответов


Если вы хотите получить определенные данные, используя номер телефона, вы можете использовать такой запрос

DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = database.child("profiles");

Query phoneQuery = ref.orderByChild(phoneNo).equalTo("+923336091371");
phoneQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
           user = singleSnapshot.getValue(User.class); 
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e(TAG, "onCancelled", databaseError.toException());
    }
});

Я думаю, что это лучший способ.


хорошо, я разобрался. приведенный выше код в вопросе отлично подходит и должен работать . Я объясняю для более поздних пользователей, которые могут иметь ту же проблему из-за ошибок, которые я сделал.

в singleSnapshot.getValue (User.class); не удалось привести результат к пользовательскому классу, потому что при загрузке данных, т. е. в setValue, у меня был photoUrl равен null и в результате вы можете видеть, что photoUrl отсутствует в моем дочернем узле. Так что я верю (и, возможно, кто-то хочу поправить меня об этом), что моя singleSnapshot.метод getValue не смог привести результат.

Итак, на данный момент я опустил photoUrl из своего пользовательского класса и вернусь к нему, когда начну работать с соответствующим модулем.

еще раз спасибо всем за предложения и помощь.

public class User {
String name;
Uri photoURL;
String bloodGroup;
String city;
String country;
double latitude;
double longitude;
boolean availableToDonate;

// Get, set and constructors are obvious here I am just saving some space in the post
}

обновление:

ошибка в вашем обновленном коде здесь.

myRef.setValue(data);

Если вы собираетесь добавить данные как myRef.setValue (data) тогда вам нужно точно указать, какой ребенок получает данные или Если вы хотите обновить все дети сразу затем вам нужно сделать атомарное обновление данных с помощью метода HashMap() и updateChildren ().

поэтому для конкретного дочернего обновления правильный способ это:

myRef.child("name").setValue(data);

Я призываю вас прочитать это официальный блог firebase чтобы понять, как обновить всех детей за один раз использование HashMap ().

дайте мне знать, если это что-то меняет для вас.


при указании местоположения базы данных UR firebase, u всегда должен использовать это имя папки в перевернутых запятых, использовать DatabaseReference myRef = база данных.ребенок ("профили");

вместо DatabaseReference myRef = база данных.ребенка("профили");