如何将 Cloud Firestore 中的数据分配给 Android 的全局变量 [重复]

Posted

技术标签:

【中文标题】如何将 Cloud Firestore 中的数据分配给 Android 的全局变量 [重复]【英文标题】:How to assign data from Cloud Firestore to a global variable for Android [duplicate] 【发布时间】:2021-03-07 03:48:33 【问题描述】:

我使用 docRef.get() 从 Cloud Firestore 获取集合的地图。但是,离开public void onSuccess(DocumentSnapshot documentSnapshot) 方法后,我无法使用地图中的值。在 JS 中,我知道我可以执行 subscribe 方法,但在 android 中我不知道该怎么做。

这是我获取地图的代码:

docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() 
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) 
                if(documentSnapshot.exists())
                    doc = documentSnapshot.getData();
                    Toast.makeText(ChatActivity.this,"Data loaded",Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(ChatActivity.this,"No data exists",Toast.LENGTH_SHORT).show();
                
            
        ).addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 
                Toast.makeText(ChatActivity.this, "Error", Toast.LENGTH_SHORT).show();
                Log.d("TAG",e.toString());
            
        );

之后我想使用地图,将textView 设置为message

for(String key : doc.keySet())
    message += key + "\n" + doc.get(key)+"\n";
 
ui.setText(message);

【问题讨论】:

***.com/questions/57330766/… 【参考方案1】:

正如@a_local_nobody 指出的那样,Firestore 调用是Asynchronous,您可以在下载该数据时使用callback 触发,这是有责任的。 一旦执行了onSuccess 回调,您的doc 变量就会处理此数据,但您的代码的其他部分可能会在调用onSuccess 之前使用它(异步)。

另一种方法是将您的代码包装到一个方法中并在 onSuccess 主体回调中使用它们,因此您可以确定该方法将在数据可分配时执行并且您不需要额外的接口将其用作回调:

public void setMessagesToUi(Doc doc)
for(String key : doc.keySet())
    message += key + "\n" + doc.get(key)+"\n";
 
ui.setText(message);

然后使用它:

docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() 
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) 
                if(documentSnapshot.exists())
                    setMessagesToUi(documentSnapshot.getData());
                    Toast.makeText(ChatActivity.this,"Data loaded",Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(ChatActivity.this,"No data exists",Toast.LENGTH_SHORT).show();
                
            
        ).addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 
                Toast.makeText(ChatActivity.this, "Error", Toast.LENGTH_SHORT).show();
                Log.d("TAG",e.toString());
            
        );

【讨论】:

以上是关于如何将 Cloud Firestore 中的数据分配给 Android 的全局变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将子集合添加到 Firebase Cloud Firestore 中的文档

如何设计Cloud Firestore数据库架构

Firestore / Cloud功能 - 如何在更改时更新Firestore数据

如何通过 Dialogflow 中的内联编辑器将 Dialogflow 连接到 Cloud Firestore?

如何从Swift中的Cloud FireStore Firebase访问特定字段

如何从 Cloud Firestore 中获取数据,其中 user.uid 等于 Flutter 中的文档 ID?