如何使用Android从Cloud Firestore中的地图检索特定字段?

时间:2020-02-26 19:56:58

标签: java android firebase google-cloud-firestore

这是保存在Firebase Firestore中的数据的一部分:

enter image description here

如何在Java中从(fName)获得(newFriend0

这是代码的一部分。它给出了整个地图。我只想要一个特定的字段,例如((fName)的“ jem”)

Map<String, Object> map = document.getData();

for (Map.Entry<String, Object> entry : map.entrySet()){

if (entry.getKey().equals("Friends")){

f=document.getString("FName");////not worked

Log.d("TAG", entry.getValue().toString());
                                                   }
                                               }

3 个答案:

答案 0 :(得分:3)

看到您的代码是Java代码,请参见下面的解决方案:

FirebaseFirestore.getInstance().collection("coll").document("9999").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Map<String, Object> friendsMap = document.getData();
                for (Map.Entry<String, Object> entry : friendsMap.entrySet()) {
                    if (entry.getKey().equals("Friends")) {
                        Map<String, Object> newFriend0Map = (Map<String, Object>) entry.getValue();
                        for (Map.Entry<String, Object> e : newFriend0Map.entrySet()) {
                            if (e.getKey().equals("newFriend0")) {
                                Map<String, Object> fNameMap = (Map<String, Object>) e.getValue();
                                for (Map.Entry<String, Object> dataEntry : fNameMap.entrySet()) {
                                    if (dataEntry.getKey().equals("fName")) {
                                        Log.d("TAG", dataEntry.getValue().toString());
                                    }
                                }
                            }
                        }
                    }
                }
            } else {
                Log.d("TAG", "No such document");
            }
        } else {
            Log.d("TAG", "get failed with ", task.getException());
        }
    }
});

您的logcat中的结果将是:

jem

在屏幕快照中没有看到您的收藏集的名称,因此我将其命名为coll,但您绝对应该将其更改为正确的名称。

答案 1 :(得分:0)

基本上,您需要执行2个步骤,retrieve the document data使用提供的库之一,然后使用编程语言来处理生成的地图对象。

这是一个简单的Node.js示例,获取“ fName”:

let docRef = db.collection('<collection_name>').doc('9999');
docRef.get()
  .then(doc => {
    if (!doc.exists) {
      console.log('No such document!');
    } else {
      console.log('Document data:', doc.data().Friends.newFriend0.fName);
    }
  })
  .catch(err => {
    console.log('Error getting document', err);
  });

答案 2 :(得分:0)

Firestore文档为JSON格式,因此我们可以先将documentSnapshot.getData()转换为String,然后再转换为JSON,这样就可以更轻松地访问Map对象数据,而无需太多的循环/迭代。另一种方法是像这样documentSnapshot.getData().get("get_only_map_key_to_be_converted_as_JSON")一样将其转换为字符串,然后再转换为JSON。可能的剩余问题是,如果您将url存储在文档的map对象中,则将有问题,因为尽管我尚未在Android Java中尝试过这种情况,但这些链接仍需要取消转义才能成为有效的JSON。