1

當用戶在我的android應用上使用firebase帳戶時,他們需要被導向到一個屏幕,他們可以添加一些單獨的信​​息,例如用戶名。該應用程序知道通過AuthStateListener切換活動,所以當一個帳戶是由或有人在這裏被執行的代碼簽名(無意圖是現在改變了這裏,請繼續閱讀看看爲什麼):如何檢查我的Firebase數據庫是否有特定用戶的數據? (Android/Java)

 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()); 
        userID = user.getUid(); 
        toastMessage("User has signed in: " + user.getEmail()); 


       } else { 
        // User is signed out 
        Log.d(TAG, "onAuthStateChanged:signed_out"); 
       } 
       // ... 
      } 
     }; 

在如果if塊檢查用戶是否不等於null,則這是我需要將意圖改爲另一個活動的地方,在這裏他們將輸入用戶名。基本上,邏輯是,如果用戶已經有一個用戶名,並且他們只是登錄,那麼他們將被定向到主屏幕活動,如果他們正在註冊,他們需要被引導到他們提供用戶名的活動。要知道我需要將哪些活動發送給我,我需要讓代碼在Firebase數據庫中查看,並查看他們的帳戶是否已有用戶名。我無法弄清楚如何在這種情況下,火力讀取數據,它好像只有這樣才能從數據庫(根據其他人)讀的是通過onDataChange方法,像這樣:

 mRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.d(TAG, "This: "+dataSnapshot.getValue()); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

它採用dataSnapshots 。與此相關的問題是,只有當數據添加到數據庫時纔會觸發此代碼,因此,當用戶僅僅註冊並且從未向數據庫添加用戶名時,此方法將不會執行任何代碼。如何查詢數據庫中的數據以檢查某個用戶是否有數據?

回答

3

OnDatachange在所有情況下被解僱,如果用戶添加數據,刪除數據,更改數據等。

要檢查是用戶已經擁有用戶名做這裏面OnDatachange

if(dataSnapshot.exists()){ 
//GO TO OTHER ACTIVITY 
]else{ 
//GO TO SET USER DATA ACTIVITY 
] 

見我實現的一個本例:

if (user !=null){ 
      DatabaseReference myRef = database.getReference("users").child(user.getUid()).child("user_bio"); 

      myRef.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()){ 
         bio.setText(dataSnapshot.getValue(String.class)); 

        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 

在本例如果user_bio存在,那麼設置文本到userbio如果不是什麼都不做。在用戶第一次在我的應用程序中登錄時,此方法不會執行任何操作,但當用戶添加bio時,此方法將生物文本設置爲userbio文本。但如果我想顯示一些文本,如果處理不當用戶生物我只需添加其他NA和設置文本到生物的爲例:

if (user !=null){ 
      DatabaseReference myRef = database.getReference("users").child(user.getUid()).child("user_bio"); 

      myRef.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()){ 
         bio.setText(dataSnapshot.getValue(String.class)); 
        }else{ 
         bio.setText("no user bio"); 
        } 
       } 
       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 
+0

我明白這一點,但如果沒有任何數據已完成,因爲用戶沒有輸入任何內容,那麼這將不會觸發,它沒有理由。 – dylan

+0

所以爲了幫助我解釋一下我在其中一個應用中使用的方法之一。 –

+0

啊,我現在看到了!非常感謝你 – dylan

1

你有沒有嘗試使用addValueEventListener onCreate方法裏面?

如果您在onCreate方法內部的偵聽器中運行活動,它將在您打開活動時觸發一次。所以我認爲你在這裏不應該有問題。

+0

是的,上面的mRef.addValueEventListener在onCreate中,但是它的onDataChange內部的方法不會被執行,直到數據被改變添加或刪除某種方式,所以如果有人沒有添加,這個代碼永遠不會執行任何信息到數據庫呢。 – dylan

+0

嗯這很奇怪,我不知道什麼是錯的,但我認爲你應該嘗試調試,看看問題的真正原因,因爲我一直使用onDataChange來調用數據庫中的數據,即使數據沒有改變,添加或刪除因爲它已經被觸發一次爲我檢索數據.. – UmarZaii

相關問題