1

У меня возникают проблемы с Firebase, и я точно не знаю, почему. Поэтому я прочитал, что при использовании Firebase для захвата текущего пользователя по их идентификатору рекомендуется использовать: FirebaseAuth.getInstance().getCurrentUser().getUid();, а затем использовать addListenerForSingleValueEvent для захвата данных через datasnapshot. Отлично, в одном из моих действий код работал, и я успешно захватил данные. Тем не менее, в моей другой деятельности слушатель полностью игнорируется в соответствии с отладчиком ... почему это так и как я должен это исправить? Или, есть ли лучший способ?Извлечь текущие данные пользователя Firebase?

Вот моя активность:

public class GroupActivity extends AppCompatActivity { 
//Tag 
private static String TAG = "GroupActivity"; 

//Firebase 
private FirebaseDatabase database = FirebaseDatabase.getInstance(); 
private DatabaseReference mDatabase = database.getReference("users").child("groups"); //Does Users -> Groups 
private DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("users"); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_group); 
    ButterKnife.bind(this); 
    initializeBottomBar(); 

    //Users from selected list -- previous activity data. 
    selectedUsers = (List<UserList>) getIntent().getSerializableExtra("users"); 
    String groupName = getIntent().getStringExtra("groupName"); 

    //CURRENT USER GOES IN FIRST. 
    // TODO : add current user. 
    String currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid(); 
    DatabaseReference newRef = mRef.child(currentUserID); 
    newRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d(TAG, "Name: " + dataSnapshot.child("name").getValue()); 

      name = String.valueOf(dataSnapshot.child("name").getValue()); 
      email = String.valueOf(dataSnapshot.child("email").getValue()); 
      username = String.valueOf(dataSnapshot.child("username").getValue()); 
      ID = String.valueOf(dataSnapshot.child("uid").getValue()); 

      mCurrentUser.setName(name); 
      mCurrentUser.setUsername(username); 
      mCurrentUser.setEmail(email); 
      mCurrentUser.setUid(ID); 

      selectedUsers.add(mCurrentUser); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 


    //ID 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
    String uniqueKey = ref.child(currentUserID).child("groups").push().getKey(); 

    //Groups of SelectedUsers! 
    SelectedUsers members = new SelectedUsers(groupName, uniqueKey, selectedUsers); 
    List<SelectedUsers> groups = new ArrayList<>(); 
    groups.add(members); 

Да, и если вам интересно, почему у меня есть несколько DatabaseReferences это потому, что я испытывал что-то, чтобы лучше понять, что происходит, это все.

UPDATE:

Я решил попробовать отладки selectedUsers.add(mCurrentUsers) путем добавления точки останова внутри ValueEventListener, и он показывает 2 пунктов, в зависимости от обстоятельств.

Однако, когда я отлаживаю вне ValueEventListener, у него отсутствует текущий пользователь. Почему это происходит?? У меня были люди, предлагающие попробовать mAuthListener, но вы не можете захватить datasnapshot, так что это кажется почти бесполезным, если вы не хотите, чтобы электронная почта пользователя и отображаемое имя, которое для вас хранило firebase ... help? Мне нужна информация о базе данных, а не информация входа/аутентификации текущего пользователя!

+0

показать мне ваш Firebase дб снимок пожалуйста –

+0

Вот ссылка на [DB SnapShot] (https://gyazo.com/a2584dc3b5e03a83c6a8f73015ad5c45) @RjzSatvara –

ответ

0

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

Решение моей проблемы состоит в том, чтобы разместить все необходимое для заполнения recyclerview внутри onDataChange. Это позволит обновлять recycerlview во время загрузки приложения.

Спасибо всем и всем, кто нашел время, чтобы попытаться помочь мне!

0

Вы можете получить текущую информацию о пользователе, используя ниже код:

mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
        Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
       } else { 
        // User is signed out 
        Log.d(TAG, "onAuthStateChanged:signed_out"); 
       } 
       // [START_EXCLUDE] 
       updateUI(user); 
       // [END_EXCLUDE] 
      } 
}; 

Еще более подробной информации посетите ссылку ниже, чтобы получить лучший пример. https://github.com/firebase/quickstart-android/tree/master/auth

+0

Как бы я получить данные из базы данных? Другими словами, как я могу использовать datasnapshot с этим, так как нет слушателя? –

0

Попробуйте переместить свои инструкции getInstance, getReference и т. Д. В раздел OnCreate. Только объявляйте свои переменные перед OnCreate, но не создавайте их там.

Хорошо, возможно, вы можете проанализировать ошибку addind это к onCancelled методы:

Log.d("onCancelled: ", databaseError.toException()); 

На самом деле, где/как объявлено или создано mCurrentUser?

+0

Это все еще не сработало, но вы абсолютно правы в объявлениях.Я все равно переехал, спасибо! –

+0

Я попытался добавить журнал, но весь метод пропущен, я предполагаю, потому что журнал даже не появляется ... интересно, почему? –

0
Firebase ref = new Firebase(FIREBASE_URL); 
ref.child("MAIN_NODE_NAME/S3l3yRh8Tq.....").addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.e("[email protected]@<DATA>",dataSnapshot+"); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 
       Log.e("MainActivity", "onCancelled", firebaseError.toException()); 
      } 
     }); 
+0

Я добавил это, и ничего до сих пор. –

+0

проверьте этот код .. и вместо ref.child (** MAIN_NODE_NAME **) добавьте свой основной узел..means root name –