2017-07-07 103 views
1

我正在開發一個android應用程序並使用Firebase存儲我的數據。我想查詢Firebase實例以檢查用戶輸入的電子郵件地址是否與Firebase中的某個電子郵件地址相匹配。附加Firebase後端數據。檢索並檢查特定用戶是否輸入了電子郵件地址

Firebase database

我的要求是,我想通過「監護人」循環,這是數據庫實例的直接子和檢查用戶是否輸入的電子郵件相匹配的電子郵件地址中的任何一個兒童。在附圖中,如果用戶輸入的電子郵件與「[email protected]」或另一個匹配,我想要做一些事情。

databaseReference = FirebaseDatabase.getInstance().getReference().child("guardians"); 
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for(DataSnapshot data: dataSnapshot.getChildren()){ 
       if (**I am unable to figure out how to search through entire guardians child for the email**) { 

       } else { 

       } 
       } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

我無法弄清楚如何在整個監護人孩子搜索,查看電子郵件是否匹配用戶輸入的電子郵件。任何幫助表示讚賞。提前致謝。

回答

0

如果您已使當前的方法正常工作(這是添加正確的if聲明的問題),那麼您將下載整個用戶列表,以檢查是否正在使用特定電子郵件地址。這非常浪費帶寬,特別是隨着用戶列表的增長。

而應該use a Firebase Database query只與所請求的電子郵件地址回報用戶:

databaseReference = FirebaseDatabase.getInstance().getReference().child("guardians"); 
Query query = databaseReference.orderByChild("guardianEmail").equalTo("[email protected]"); 
query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.exists()) { 
       ... the email address is already in use 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      throw databaseError.toException(); // don't ignore errors 
     } 
    }); 

一定要add an indexguardianEmail領域,否則你還是會最終下載的所有數據的查詢。

請注意,此主題已被覆蓋了很多次,並有更好的方法來做這個檢查。其中大多數涉及創建一個所謂的倒排索引,在這裏您使用用戶的(編碼)電子郵件地址作爲密鑰。通過這種結構,您可以防止Firebase服務器端安全規則中出現重複,這更加高效。

有關這方面和其他方法,請參閱:

+0

非常感謝您的SUG GESTION。我的要求就像我想在用戶嘗試註冊應用程序時一樣,用戶輸入的電子郵件不應與監護人孩子中的任何電子郵件相匹配。 –

+0

我嘗試了你建議的方法。但即使我輸入了監護人子女名單中的電子郵件地址,它也會轉到else塊。是否因爲我缺少用戶ID?我的Firebase結構是數據庫實例 - >監護人--->用戶ID -----> guardianEmail –

+0

我剛跑過這段代碼:'ref.orderByChild(「name」)。equalTo(「name2」)。addListenerForSingleValueEvent (new ValueEventListener(){ public void onDataChange(DataSnapshot dataSnapshot){ System.out.println(dataSnapshot.exists()); }'。當存在匹配的名稱時顯示'true',當存在匹配的名稱時顯示'false'不是的, –

相關問題