如何通过 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以上是关于如何通过 JAVA 方法从 Firestore 返回数据而不是 0 值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
从firestore查询数据时,如何将保存的字符串格式的日期与当前日期进行比较?
Kotlin - 如何执行 onCompleteListener 从 Firestore 获取数据?