Java Firestore未查询第二个集合

Java Firestore未查询第二个集合,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我对android studio和firestore数据库和 我在查询我的第二个firestore收藏时遇到一些问题。正如标题所示,我正在查询两个集合,第一个是: 使用代码: firestore = FirebaseFirestore.getInstance(); FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() .build(); fires

我对android studio和firestore数据库和 我在查询我的第二个firestore收藏时遇到一些问题。正如标题所示,我正在查询两个集合,第一个是:

使用代码:

    firestore = FirebaseFirestore.getInstance();
    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
            .build();
    firestore.setFirestoreSettings(settings);
    firestore.collection("Obiective").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {

            //<--------- Check if firestore entry is already downloaded into file --------->
            SingletonObjectivesId.getInstance().getIds().clear();
            for (QueryDocumentSnapshot document : task.getResult()) {
                Log.d(TAG, task.getResult().size() + " number of documents");
                SingletonObjectivesId.getInstance().setSize(task.getResult().size());

                if(document.exists() && document != null) { ...
firestore=FirebaseFirestore.getInstance();
FirebaseFirestoreSettings=新建FirebaseFirestoreSettings.Builder()
.build();
firestore.setFirestoreSettings(设置);
firestore.collection(“Objective”).get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//
SingletonObjectivesId.getInstance().GetId().clear();
对于(QueryDocumentSnapshot文档:task.getResult()){
Log.d(标记,task.getResult().size()+“文档数”);
SingletonObjectivesId.getInstance().setSize(task.getResult().size());
如果(document.exists()&&document!=null){。。。
第二个集合的格式如下:

使用代码:

        firestore.collection("Routes")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {

                        Log.d(TAG, task.getResult().size() + " = task.getResult().size()");

                        for (QueryDocumentSnapshot document : task.getResult()) {
                            objectives_id.clear();
                            id_route = document.getId();

                            if(document.exists() && document != null) {
                                Map<String, Object> map = document.getData();
                                for (Map.Entry<String, Object> entry : map.entrySet()) {
                                    String field_name = entry.getKey() + "";
                                    String id = document.getString(field_name) + "";
                                    objectives_id.add(id);
                                }
                            }
                            routes.add(new Route(objectives, objectives_id, id_route));
                        }
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
            });
firestore.collection(“路由”)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Log.d(标记,task.getResult().size()+“=task.getResult().size()”;
对于(QueryDocumentSnapshot文档:task.getResult()){
目标_id.clear();
id_route=document.getId();
if(document.exists()&&document!=null){
Map=document.getData();
对于(Map.Entry:Map.entrySet()){
字符串字段_name=entry.getKey()+“”;
字符串id=document.getString(字段名称)+“”;
目标_id.添加(id);
}
}
路线。添加(新路线(目标、目标、id、id、路线));
}
}否则{
Log.d(标记“获取文档时出错:”,task.getException());
}
}
});
正如您在第二段代码中看到的,我添加了一个Log.d(在if(task.issusccessful())之后),它将显示文档数。在我的例子中,第一个查询Log.d返回3,第二个返回0,尽管我在其中有两个文档。我如何访问这两个文档


谢谢。

Firebase API是异步的,这意味着方法在调用后立即返回,它返回的任务的回调将在一段时间后调用。无法保证需要多长时间。因此可能需要几百毫秒到几秒钟才能获得数据。由于该方法立即返回,因此您尝试登录,但尚未从回调中填充

基本上,您正在尝试同步使用来自异步API的值。这不是一个好主意。您应该按照预期异步处理API


这个问题的一个快速解决方法是将查询第二个集合的代码移动到第一个回调中(在
onComplete()方法中)所谓的嵌套查询,否则我建议您查看我的anwser的最后一部分,我在其中解释了如何使用自定义回调来完成。您也可以查看一下这个,以便更好地理解。

在我遵循视频中的步骤后,我更新了如下代码:

我在课程开始时创建了一个全局变量firestore

private FirebaseFirestore firestore;
我有两个方法readDataObjective和readDataRoute以及两个接口FirestoreCallbackRoutes和FirestoreCallbackRoutes

readDataRoutes

    private void readDataRoute(FirestoreCallbackRoute firestoreCallbackRoute){
    firestore.collection("Trasee").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) { ...
private void readDataRoute(FirestoreCallbackRoute FirestoreCallbackRoute){
firestore.collection(“Trasee”).get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){。。。
readDataObjective

   private void readDataObjective(FirestoreCallback firestoreCallback){
    firestore.collection("Obiective").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {   
                SingletonObjectivesId.getInstance().getIds().clear();
                for (QueryDocumentSnapshot document : task.getResult()) { ...
private void readDataObjective(FirestoreCallback FirestoreCallback){
firestore.collection(“Objective”).get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
SingletonObjectivesId.getInstance().GetId().clear();
对于(QueryDocumentSnapshot文档:task.getResult()){。。。
接口

private interface FirestoreCallback{
    void onCallback(ArrayList<Objective> list);
}

private interface FirestoreCallbackRoute{
    void onCallback(ArrayList<Route> list);
}
私有接口FirestoreCallback{
void onCallback(数组列表);
}
专用接口FirestoreCallbackRoute{
void onCallback(数组列表);
}
在onCreate方法中,我像这样调用readDataObjective和readDataRoute

firestore = FirebaseFirestore.getInstance();
    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder().build();
    firestore.setFirestoreSettings(settings);

    readDataObjective(new FirestoreCallback() {
        @Override
        public void onCallback(ArrayList<Objective> list) {
            for(Objective item : list){
                //Create plainText Object - delimiter "/~/"
                String data = "Title:" + item.getTitle() + "/~/" +

............................

     } else if(str.contains("Longitude:")){
                            obj.setLongitude(str.substring(10,str.length()));
                        }

                        start = crt + 2;
                    }
                }
                SingletonObjectivesArray.getInstance().getObjectives().add(obj);
            }

            readDataRoute(new FirestoreCallbackRoute() {
                @Override
                public void onCallback(ArrayList<Route> list) {
                    Log.d(TAG, 2 + " ");
                    ArrayList<Objective> routeObjectives = new ArrayList<>();

                    for (int i = 0; i < list.size(); i++) {
                        routeObjectives.clear();
                        for (int j = 0; j < SingletonObjectivesArray.getInstance().getObjectives().size(); j++){ ...
firestore=FirebaseFirestore.getInstance();
FirebaseFirestoreSettings设置=新建FirebaseFirestoreSettings.Builder().build();
firestore.setFirestoreSettings(设置);
readDataObjective(新FirestoreCallback(){
@凌驾
公开作废回拨(ArrayList列表){
用于(目标项目:列表){
//创建纯文本对象-分隔符“/”
String data=“Title:+item.getTitle()+”/~/”+
............................
}else if(str.contains(“经度:”)){
对象设置经度(str.substring(10,str.length());
}
开始=c