【问题标题】:Firestore getCount method returns task. How to convert to int or String?Firestore getCount 方法返回任务。如何转换为 int 或 String?
【发布时间】:2018-08-29 10:16:28
【问题描述】:

我正在使用 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?

【问题讨论】:

    标签: android firebase task google-cloud-firestore


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      getCount() 方法的返回类型是 Task&lt;Integer&gt;不是 Integer,正如您可能想的那样。确实,在初始化 Continuation 类(实际上是一个匿名类)时,重写方法的返回类型为 Integer,但这不是您的封闭 getCount() 的返回类型方法。所以这个方法永远不会返回一个 Integer 对象。

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

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

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

      要解决这个问题,您应该只在内部 then 方法中使用 count 的值。如果您想统计一个集合中的所有文档,请参阅我在此 post 中的回答。

      您也可以使用addOnSuccessListener,正如@Doug Stevenson 在他的回答中提到的那样,这是一种更简单、更优雅的方式。

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 2011-04-25
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        相关资源
        最近更新 更多