Firestore getCount 方法返回任务.如何转换为 int 或字符串?



我正在使用Firestore分片来跟踪集合中的文档数量。如何将它返回的任务转换为字符串?

我的方法(与 Firebase 文档相同(:

public Task<Integer> getCount(final DocumentReference ref) {
// Sum the count of each shard in the subcollection
return ref.collection("shards").get()
.continueWith(new Continuation<QuerySnapshot, Integer>() {
@Override
public Integer then(@NonNull Task<QuerySnapshot> task) throws Exception {
int count = 0;
for (DocumentSnapshot snap : task.getResult()) {
Shard shard = snap.toObject(Shard.class);
count += shard.count;
}
Log.d(TAG, Integer.toString(count));
return count;
}
});
}

正确记录计数,如下所示:D/saveMessageSent: 1

但是,当我在其他地方调用 getCount 方法时,如下所示:

Log.d(TAG, String.valueOf(getCount(counterDocRef)));

则日志输出为:

D/saveMessageSent: com.google.android.gms.tasks.zzu@8673e29

我似乎无法将其转换为字符串,因为它说它是一个

com.google.android.gms.tasks.Task<java.lang.Integer>

我该如何解决这个问题,所以当我调用 getCount 时,它会给我一个可以使用的 int?

不要将任务对象转换为其他类型的对象。 您可以使用任务 API 在回调中接收异步任务的结果。 例如,如果你有一个任务,它将在成功回调中产生一个整数:

task.addOnSuccessListener(new OnSuccessListener<Integer>() {
@Override
public void onSuccess(Integer i) {
// i is the Integer result of the task.
}
});

getCount()方法的返回类型是您可能认为的Task<Integer>而不是Integer的确,在初始化Continuation类(实际上是匿名类(时,重写方法的返回类型为Integer,但这不是封闭getCount()方法的返回类型。因此,此方法永远不会返回 Integer 对象。

当您尝试使用以下语句时:

Log.d(TAG, String.valueOf(getCount(counterDocRef)));

它不会打印整数,因为您向valueOf()方法传递了一个Task<Integer>对象而不是Integer,这就是您得到那个奇怪的日志语句的原因。实际打印的是内存中该对象的实际地址。

若要解决此问题,应仅在内部then方法中使用count的值。如果您想计算集合中的所有文档,请参阅我在这篇文章中的回答。

你也可以用addOnSuccessListener,@Doug史蒂文森在他的回答中也提到过,这是一种更简单、更优雅的方式。

最新更新