2016-11-11 8 views
0

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

Я хочу, чтобы получить один «Пользователь» Объект моего Firebase в реальном времени базы данных, поэтому я добавляю ValueListener , правильно? У меня есть метод getUser, который имеет «User» как returnvalue. В там я использую это:

ValueEventListener valueListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot snap : dataSnapshot.getChildren()) 
      { 
       User u = snap.getValue(User.class); 
       if(u.getEmail().equals(userEmail)) 
       { 
        //user = u; 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 
    //Adding the Listener for Single Event 
    fref.child("User").addListenerForSingleValueEvent(valueListener); 
    //Using "u" here then 

Сейчас я не вижу хороший способ получить, что пользователь «и» оттуда, как я получаю это?

Я знаю, что это должно быть основы, но я просто не понимаю ..

заранее спасибо :)

ответ

0

насчет:

private User targetUser; 

@Override 
protected void onStart() { 
    super.onStart(); 
    final ValueEventListener userListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      userNameList = new ArrayList<>((ArrayList) dataSnapshot.getValue()); 
      for (User u : userNameList) { 
       if (u.getEmail().equals(userEmail)) { 
        targetUser = u; 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.e(TAG, "onCancelled: Failed to load User list."); 

     } 
    }; 
    userlistReference.addValueEventListener(userListener); 

    mUserListListener = userListener; 
    //use targetUser reference but check if it is null(can be null)... 
} 
-1

Вам просто нужно создать глобальный переменная в классе, как:

private User myUser; 

Тогда внутри вашего слушателя просто сделать:

myUser = u; 

Это самый простой способ ...

0

Вы должны использовать CountDownLatch - этот объект позволит вам ждать, пока слушатель на самом деле вызывается перед возвратом объекта:

private User getUser() { 
    final User user = null ; 
    final CountDownLatch cdl = new CountDownLatch(1); 
    ValueEventListener valueListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot snap : dataSnapshot.getChildren()) 
      { 
       User u = snap.getValue(User.class); 
       if(u.getEmail().equals(userEmail)) 
       { 
        user = u; 
        break ; 
       } 
      } 
      cdl.countDown(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      cdl.countDown(); 
     } 
    }; 
    //Adding the Listener for Single Event 
    fref.child("User").addListenerForSingleValueEvent(valueListener); 
    try { 
     cdl.await(); 
    } catch (InterruptedException ie) { 
    } 
    return user ; 
} 
+0

Этот тоже не работает, блок get получает всегда в cld.countDown() –

+0

@RobertoFernandez, он действительно заблокирован на 'countDown()'? Странно, я этого никогда не видел. Обычно он блокируется на 'àwait()'. Хорошо, что решение работает для меня ... – Benoit

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