Java 如何从Firestore获取数组并在Android中循环?

Java 如何从Firestore获取数组并在Android中循环?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我试图获取一个名为services的字段,它是Firestore文档中的字符串数组 我是这样做的: fAuth = FirebaseAuth.getInstance(); fStore = FirebaseFirestore.getInstance(); fAuth.signInWithEmailAndPassword(Etemail.getText().toString(), Etpassword.getText().toString()).addOnSu

我试图获取一个名为services的字段,它是Firestore文档中的字符串数组

我是这样做的:

    fAuth = FirebaseAuth.getInstance();
    fStore = FirebaseFirestore.getInstance();
    
      fAuth.signInWithEmailAndPassword(Etemail.getText().toString(), Etpassword.getText().toString()).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                    @Override
                    public void onSuccess(AuthResult authResult) {
  
                        Uid = authResult.getUser().getUid();
                        checkUserAccessLevel(Uid);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                        Toast.makeText(LoginActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
                
                 private void checkUserAccessLevel(String uid) {
                 
                 DocumentReference df = fStore.collection("Users").document(uid);

                df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            
            if (task.isSuccessful()) {
                List<String> services = new ArrayList<>();
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    Map<String, Object> map = document.getData();
                    for (Map.Entry<String, Object> entry : map.entrySet()) {
                        services.add(entry.getValue().toString());
                    }
                    Log.d(TAG, services.toString());
                    
                } else {
                    Log.d(TAG, "No such document");
                }
            } else {
                Log.d(TAG, "get failed with ", task.getException()); 
            }
        }

    });
                 
}
fAuth=FirebaseAuth.getInstance();
fStore=FirebaseFirestore.getInstance();
fAuth.signInWithEmailAndPassword(Etemail.getText().toString(),Etpassword.getText().toString()).addOnSuccessListener(新OnSuccessListener


请帮助我完成此任务。

要获取“服务”数组中存在的值,您需要读取文档的内容。记住DocumentSnapshot的方法返回一个可以简单迭代的映射,如下代码行所示:

FirebaseFirestore fStore = FirebaseFirestore.getInstance();
DocumentReference df = fStore.collection("Users").document(uid);
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            List<String> services = new ArrayList<>();
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Map<String, Object> map = document.getData();
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    services.add(entry.getValue().toString());
                }
                Log.d(TAG, services.toString());
                //Do what you need to do with your services List
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException()); //Don't ignore potential errors!
        }
    }
});

您可以使用
get()
方法或
getData()
方法

  • get()
    方法接受一个
    字符串
    参数(字段名-注意此方法也有不同的版本)并返回
    对象
    ,您需要对您的数据类型进行分类。如果您不想从文档中获取作为
    映射的整个数据,可以将其用于单个字段(或多个字段)
  • getData()
    方法返回文档中的全部数据,因为
    Map
    String
    是文档的字段名,而
    Object
    是属于该字段的数据。使用字段名(或名称)可以获取属于该字段(或多个字段)的数据。此外,还需要转换为数据类型
使用
Get()
方法根据字段名获取数据:

 df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        List<String> services = new ArrayList<>(),
                                timeSlot = new ArrayList<>();
                        if (document.exists()) {
                            services = (List<String>) document.get("services");
                            timeSlot = (List<String>) document.get("time_slot");
                        } else {
                            Log.e(TAG, "Document is not exist");
                        }
                    }else{
                        Log.e(TAG, "Task Failed: " + task.getException());
                    }
                }
            });

你还没有说你提供的代码有什么问题。确保你发布了你想要的输出,你实际得到的,任何崩溃等。嘿,Alex,谢谢你的回复和时间。在logcat中,它显示了完整的集合,如[人名,9864,[心脏病学,肿瘤学,神经病学,泌尿学],1,xyz@gmail.com, [09:00至10:00,10:00至11:00,11:00至12:00,12:00至13:00]]我只是想要一系列服务,如=>[Cardiology,Oncology,Neurology,Urology]有什么解决办法吗?这是我从firestore获得的json对象结构:{FullName=XYZ JKL,PhoneNumber=9865####,services=[Cardiology,Onology,Neurology,Urology,Urology],isAdmin=1,UserEmail=abc@gmail.com,time_slot=[09:00至10:00,10:00至11:00,11:00至12:00,12:00至13:00]}请编辑您的问题并添加您现在使用的代码并生成输出。我已编辑了帖子的代码,请检查。这是应用您提供的修补程序后的代码。好的,让我再次检查。
 df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        List<String> services = new ArrayList<>(),
                                timeSlot = new ArrayList<>();
                        if (document.exists()) {
                            services = (List<String>) document.get("services");
                            timeSlot = (List<String>) document.get("time_slot");
                        } else {
                            Log.e(TAG, "Document is not exist");
                        }
                    }else{
                        Log.e(TAG, "Task Failed: " + task.getException());
                    }
                }
            });
df.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot document = task.getResult();
                        List<String> services = new ArrayList<>(),
                                timeSlot = new ArrayList<>();
                        if (document.exists()) {
                            Map<String, Object> data = document.getData();
                            services = (List<String>) data.get("services");
                            timeSlot = (List<String>) data.get("time_slot");
                        } else {
                            Log.e(TAG, "Document is not exist");
                        }
                    }else{
                        Log.e(TAG, "Task Failed: " + task.getException());
                    }
                }
            });