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

时间:2018-10-30 12:31:40

标签: android firebase google-cloud-firestore

在尝试从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.
 }

编辑

存储库类中的方法:

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

ViewModel类中的方法:

public List<Passion> downloadpassionlist()
{
   return mPassionRepository.downloadpassion();
}

1 个答案:

答案 0 :(得分:1)

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

在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。您不必遵循这些准则,但是它们使其他人更容易阅读您的代码。