【问题标题】:How to get array from Firestore and loop through it in Android?如何从 Firestore 获取数组并在 Android 中循环遍历它?
【发布时间】:2021-04-07 08:55:21
【问题描述】:

我正在尝试获取一个名为 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()); 
            }
        }

    });
                 
}

这是 Firebase Firestore DB 的屏幕截图!

请帮我完成任务。

【问题讨论】:

  • 您实际上并没有说出您提供的代码有什么问题。确保发布您想要的输出、实际得到的结果、任何崩溃等。

标签: java android firebase google-cloud-firestore


【解决方案1】:

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

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!
        }
    }
});

logcat 中的结果将是:

[Cardiology, Oncology, Neurology, Urology]

【讨论】:

  • 嗨,Alex,感谢您的回复和时间。在 logcat 中,它显示的完整集合如下 [Person Name, 9864#####, [Cardiology, Oncology, Neurology, Urology], 1, xyz@gmail.com, [09:00 to 10:00, 10:00到 11:00、11:00 到 12:00、12:00 到 13:00]] 我只想要一系列服务,例如 => [心脏病学、肿瘤学、神经学、泌尿学] 有什么解决方法吗?
  • 这是我从 firestore 获取的 json 对象结构:{FullName=XYZ JKL, PhoneNumber=9865#####, services=[Cardiology, Oncology, Neurology, 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]}
  • 请编辑您的问题并添加您正在使用的代码现在并生成该输出。
  • 我已经编辑了帖子的代码,请检查。这是应用您提供的补丁后的代码。
  • 好的,我再检查一遍。
【解决方案2】:

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

  • get() 方法采用 String 参数(字段名称 - 请注意此方法也有不同的版本)并返回 Object 并且您需要对您的数据类型进行种姓。如果您不想以 Map&lt;String, Object&gt; 的形式从文档中获取整个数据,可以将其用于单个字段(或多个字段)。
  • getData() 方法从文档中返回整个数据为Map&lt;String, Object&gt;。 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());
                    }
                }
            });

使用getData() 方法获取所有数据并使用字段名称获取字段值:

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());
                    }
                }
            });

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2018-01-14
    • 2021-07-21
    • 2011-03-27
    • 2011-08-21
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多