验证后查询Firestore的uid文件=> IllegalStateException异常

时间:2017-11-15 20:55:36

标签: android firebase google-cloud-firestore

我正在为我的Android应用使用Firebase Authentification和Firestore。我想要做的是以下几点:

  • 用户登录
  • 如果是第一次用户登录由他的uid命名的文档,则
  • 如果用户之前已经登录(因此uid命名的文档已经存在),那么我会加载一些其他数据。

这是我解决这个问题的逻辑:

  • 从FirebaseAuth实例获取FirebaseUser
  • 来自FirebaseUser的
  • 我得到了uid
  • 使用此uid构建DocumentReference
  • 在DocumentReference上使用get()查询
  • 如果DocumentSnapshot是!= null,则用户已存在于firestore中
  • 如果DocumentSnapshot == null,则用户不存在,我在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());
                }
            }
        });
    }

当firestore中存在uid时,我会收到包含相应数据的日志消息,但是当它没有时,我得到以下异常,我找不到使用DocumentSnapshot.exists()的方法:

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

任何人都可以帮我理解我做错了吗?

万分感谢! :)

1 个答案:

答案 0 :(得分:3)

get()返回的对象是DocumentSnapshot而不是文档本身。 DocumentSnapshot永远不会为空。使用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());
    }
}