如何使用带有清晰代码的Firebase Cloud Firestore引用?

时间:2019-06-10 10:25:09

标签: android firebase google-cloud-firestore

因此,我正在使用Firebase Cloud,在获得数据之前,我需要遍历三个参考。

这个问题使我创建了3个匿名嵌套类,它们看起来很可怕,难以遵循并且可能很难维护。

我已经添加了该代码,希望能为您提供建议-我应该如何清理它?

db.collection("users").document(mAuth.getUid())
                .get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            DocumentSnapshot document = task.getResult();
                            if (document.exists()) {
                                ((DocumentReference)document.get("Users_Project")).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                        if (task.isSuccessful()) {
                                            DocumentSnapshot document = task.getResult();
                                            if (document.exists()) {
                                                ((DocumentReference) document.get("Project_Schedule")).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                                                        if (task.isSuccessful()) {
                                                            DocumentSnapshot document = task.getResult();
                                                            if (document.exists()) {
                                                                //we got the data!!!!
                                                                Log.d(TAG, "DocumentSnapshot data: " + document.getData());
                                                            } else {
                                                                Log.d(TAG, "No such document as projectschedule ref");
                                                            }
                                                        } else {
                                                            Log.d(TAG, "get failed with ", task.getException());
                                                        }
                                                    }
                                                });
                                            } else {
                                                Log.d(TAG, "No such document as projectschedule");
                                            }
                                        } else {
                                            Log.d(TAG, "get failed with ", task.getException());
                                        }
                                    }
                                });
                            } else {
                                Log.d(TAG, "No such document as userproj");
                            }
                        } else {
                            Log.d(TAG, "get failed with ", task.getException());
                        }
                    }
                });

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

db.collection("users").document(mAuth.getUid())
        .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                callback1(document);
            } else {
                Log.d(TAG, "No such document as userproj");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

    private void callback1(DocumentSnapshot document)
    {
        ((DocumentReference)document.get("Users_Project")).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    callback2();
                } else {
                    Log.d(TAG, "get failed with ", task.getException());
                }
            }
        });
    }

    private void callback2(DocumentSnapshot document)
    {
        DocumentSnapshot document = task.getResult();
        if (document.exists()) {
            ((DocumentReference) document.get("Project_Schedule")).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        callback3();
                    } else {
                        Log.d(TAG, "get failed with ", task.getException());
                    }
                }
            });
        } else {
            Log.d(TAG, "No such document as projectschedule");
        }
    }

    private void callback3(DocumentSnapshot document)
    {
        DocumentSnapshot document = task.getResult();
        if (document.exists()) {
            //we got the data!!!!
            Log.d(TAG, "DocumentSnapshot data: " + document.getData());
        } else {
            Log.d(TAG, "No such document as projectschedule ref");
        }
    }