2016-09-30 6 views
1

Я хочу прочитать конкретные данные из базы данных 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

Метод записи в БД

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

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

+0

У вас есть разрешение на данные? См. Http://stackoverflow.com/documentation/firebase/5548/how-do-i-listen-for-errors-when-accessing-the-database/22652/detect-errors-when-reading-data-on-android # t = 201609302251033886091 –

+0

@FrankvanPuffelen snap shot, который он разделяет, имеет флаг безопасности по умолчанию ** по умолчанию **, это не значит, что ** его .write и .read оба являются auth! = null? ** В этом Если он может написать, то он должен уметь читать, так как пользователь имеет право, не так ли? Пожалуйста, поправьте меня, если я ошибаюсь. –

+0

Я пропустил этот баннер, но на самом деле он должен. Наиболее вероятная проблема заключается в том, что пользователь не аутентифицирован. Что-то, что вы можете наиболее легко обнаружить, если добавить простой 'throw databaseError.toException()' в 'onCancelled()' и слушатель завершения в 'setValue()'. Оба документа задокументированы на странице, с которой я связан. –

ответ

1

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

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

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

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

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

ОБНОВЛЕНО:

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

myRef.setValue(data); 

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

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

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

Я рекомендую вам прочитать эту official firebase blog, чтобы понять, как обновить все дети в один идти используя HashMap().

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

+0

Я только что обновил вопрос, как я пишу в БД. Фактически/указывает, что узел находится внутри узла профилей. –

+0

Ваши данные? .. Вы обновляете все дети или что-то конкретное? –

+0

Хотя в части обновления я обновляю определенные дочерние элементы, используя setValue. –

0

, указывая местонахождение базы данных базы данных ur, u должен всегда использовать это имя папки в кавычках, используйте DatabaseReference myRef = database.child ("profiles");

вместо DatabaseReference myRef = database.child ("profiles /");

6

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

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()); 
    } 
}); 

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

Смежные вопросы