如何通过 JAVA 方法从 Firestore 返回数据而不是 0 值? [复制]

Posted

技术标签:

【中文标题】如何通过 JAVA 方法从 Firestore 返回数据而不是 0 值? [复制]【英文标题】:How can I return data and not 0 value from Firestore through JAVA method? [duplicate] 【发布时间】:2019-04-03 11:58:40 【问题描述】:

在尝试从 Firestore 检索数据时,发现返回值始终为 0。有人可以建议如何纠正这个问题吗?

public List<Passion> getPassionvalue() 
  List<Passion> msglist = new ArrayList<>();
  CollectionReference col_ref = this.get_collection_firestore("Passion")
  col_ref
          .get()
          .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
              @Override
              public void onComplete(@NonNull Task<QuerySnapshot> task) 
                  if(task.isSuccessful())
                  
                      for(QueryDocumentSnapshot document : task.getResult())
                      

                          Passion passion =document.toObject(Passion.class);
                          msglist.add(passion);
                      
                  
                  else 
                  
              
          );
  return msglist; // return value is always 0 as if no data.
 

编辑

Repository 类中的方法:

public List<Passion> downloadpassion()
  
    return fsDB.getPassionvalue();
  

ViewModel 类中的方法:

public List<Passion> downloadpassionlist()

   return mPassionRepository.downloadpassion();

【问题讨论】:

您的意思是列表的大小为零?我们需要查看 Firebase 中的数据结构。 @Wanderer 感谢回复。数据结构只有一个集合和多个文档,其中一个字段称为激情。数据结构没有问题。因为当我检查'for循环'时,我在那里找到了数据。它只是发生该方法没有等待'for循环'完成然后返回它。它只是完全跳过 for 循环并转到最后一条语句,就好像它正在放在另一个线程上一样。希望我能够澄清。如果不让我知道。 Rgds 哦,当然。这就是异步任务的危险。给我一点,我会写一个答案。 【参考方案1】:

android 中的 Internet 请求必须是异步的,以避免冻结 UI。由于 Firebase 是一项基于互联网的服务,因此具有相同的限制/要求。

当您在 Java 中使用侦听器时,程序不会等到该侦听器被调用后再继续通过它,因为这会破坏异步的目的。

因此,您不能使用直接返回值的简单 getter 方法。相反,您需要使用自己的侦听器。

创建一个新接口(在您正在编辑的文件中或作为它自己的类):

public interface OnPassionsFilledListener 
    void onPassionsFilled(ArrayList<Passion> passions);
    void onError(Exception taskException);

然后,稍微修改一下你的方法:

public void getPassionValue(OnPassionsFilledListener listener) 
    get_collection_firestore("Passion")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) 
                    if (task.isSuccessful()) 
                        ArrayList<Passion> passions = new ArrayList<>();

                        for (QueryDocumentSnapshot document : task.getResult()) 
                            Passion passion = document.toObject(Passion.class);
                            passions.add(passion);
                        

                        listener.onPassionsFilled(passions);
                     else 
                        listener.onError(task.getException());
                    
                
            );

调用你的方法:

getPassionValue(new OnPassionsFilledListener() 
    @Override
    public void onPassionsFilled(ArrayList<Passion> passions) 
        //handle the list
    

    @Override
    public void onError(Exception taskException) 
        //handle the error
    
);

顺便说一句,在 Java 中,方法和变量名使用camelCase(不是underscore_case),类使用TitleCase。您不必遵循这些准则,但它们可以让其他人更轻松地阅读您的代码。

【讨论】:

@Wanderer 感谢您的回答。以下方法需要 onPassionsFilled 中可用的值,以便进一步使用 public List downloadpassion() return fsDB.getPassionvalue(); 我们怎样才能做到这一点? 您需要重构代码以考虑网络调用的异步特性。 我确实实现了回调,但坚持如何在父方法中发送值,以便它可以在 ViewModel 中返​​回。你能建议吗.. 编辑我的帖子以在 ViewModel & Repository 类中包含方法 @Wanderer 还有其他方法可以作为单线程运行以执行此方法吗?

以上是关于如何通过 JAVA 方法从 Firestore 返回数据而不是 0 值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Firestore + 云功能:如何从另一个文档中读取

从firestore查询数据时,如何将保存的字符串格式的日期与当前日期进行比较?

Kotlin - 如何执行 onCompleteListener 从 Firestore 获取数据?

如何快速解码来自 Firebase Firestore 的时间戳

如何从firestore获取当前用户数据?

如何从 FireStore 查询文档名称?