2017-11-15 1 views
2

Android 앱에 Firebase 인증과 Firestore를 모두 사용하고 있습니다. 는 사용자가 이미 로그인 한 경우 자신의 UID에 의해 명명 된 문서에 사용자가 로그인 인증 후 uid 문서에 대한 Firestore 쿼리 => IllegalStateException

  • 만들어 처음 인 경우
  • 에서

    • 사용자 기호 : 내가 뭘하려고하면 다음과 같다 이전에 (따라서 uid에 의해 명명 된 문서가 이미 있음) 다음 추가 데이터를로드합니다. (필자는 UID
    • 이 UID
    • 사용 GET으로 DocumentReference을 구축 얻을 FirebaseUser에서 FirebaseAuth 인스턴스
    • 에서 FirebaseUser를 얻을

      • :

      다음은이 문제를 해결하기 위해 내 논리입니다)에 대한 쿼리

    • DocumentSnapshot이! = null 인 경우 사용자가 이미 파이어 스토어에 있음
    • DocumentSnapshot는 == null의 사용자가 존재하지 않습니다와 나는

    나는 아래의 코드를 테스트 한 경우 FireStore에서 그것을 만드는 경우 : UID는 경우 FireStore에 존재하는 경우

    FirebaseUser user = mAuth.getCurrentUser(); 
        if(user != null) { 
         // get uid from user 
         String uid = user.getUid(); 
    
         // make a query to firestore db for uid 
         DocumentReference userDoc = db.collection("users").document(uid); 
         userDoc.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { 
          @Override 
          public void onComplete(@NonNull Task<DocumentSnapshot> task) { 
           if (task.isSuccessful()) { 
            DocumentSnapshot document = task.getResult(); 
            if (document != null) { 
             Log.d(LOG_TAG, "DocumentSnapshot data: " + task.getResult().getData()); 
            } else { 
             Log.d(LOG_TAG, "No such document"); 
            } 
           } else { 
            Log.d(LOG_TAG, "get failed with ", task.getException()); 
           } 
          } 
         }); 
        } 
    
    나는 로그 메시지를 얻을 수

    적절한 데이터하지만 나는 다음과 같은 예외가되지 않습니다 내가 DocumentSnapshot.exists()를 사용하여 얻을 수있는 방법 찾을 수 없을 때 :

    java.lang.IllegalStateException: This document doesn't exist. Use DocumentSnapshot.exists() to check whether the document exists before accessing its fields. 
    

    사람이 제가 뭘 잘못 이해하는 데 도움을 ?

    감사합니다. :)

  • 답변

    2

    get()에 의해 반환 된 개체는 DocumentSnapshot이며 문서 자체는 아닙니다. DocumentSnapshot은 null이 아닙니다. exists() 메서드를 사용하여 스냅 숏에 문서가 포함되어 있는지 확인하십시오. exists()이 참일 경우 getXXX() 메쏘드 중 하나 (귀하의 경우에는 getData()지도)를 안전하게 사용하여 문서의 가치를 얻을 수 있습니다.

    @Override 
    public void onComplete(@NonNull Task<DocumentSnapshot> task) { 
        if (task.isSuccessful()) { 
         DocumentSnapshot snapshot = task.getResult(); 
         if (snapshot.exists()) { 
          Log.d(LOG_TAG, "DocumentSnapshot data: " + snapshot.getData()); 
         } else { 
          Log.d(LOG_TAG, "No such document"); 
         } 
        } else { 
         Log.d(LOG_TAG, "get failed with ", task.getException()); 
        } 
    } 
    
    관련 문제