0

私はいくつかのDaysコレクションでアクティビティ文書を用意しており、リスト内のすべてのアクティビティを結合する必要があります。私はコレクションをループし、アクティビティをループする必要があり、複数のコレクションを結合する最良の方法かどうかわからない以下のコードで終わったと思った。さらに悪いことに、私のリストがすべての非同期呼び出しで使用される準備が整っているのはわかりません。 アドバイスはありますか?ありがとう!あなたは(クエリのサブクラスである)CollectionReferenceに使用しているAndroidのネストされたFirestore非同期リスナー

db.collection("calendar").get() 
     .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { 
      @Override 
      public void onComplete(@NonNull Task<QuerySnapshot> task) { 
       if (task.isSuccessful()) { 
        for (DocumentSnapshot ds : task.getResult().getDocuments()) { 
         ds.getReference().collection("thingstodo").get() 
           .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { 
            @Override 
            public void onComplete(@NonNull Task<QuerySnapshot> task) { 
             for (DocumentSnapshot ds : task.getResult().getDocuments()) { 
              ScheduledItem item = ds.toObject(ScheduledItem.class); 
              itemsList.add(item); 
             } 

            } 
           }); 

        } 
      } 
     }); 

答えて

0

get()方法は、文書の準備ができたときに解決になりTaskを返します。その個々のタスクにリスナーを追加する代わりに、すべてのタスクをリストにまとめ、それをTasks.whatAllComplete()に渡して、セット全体が完了したときに応答します。必要に応じて、そこのすべてのタスクの結果を調べることができます。

+0

ありがとうございました、タスクマスター! :)しかし、これは私にとってはあまりにも進んでいます。いくつかの例を指摘してもらえますか?ありがとう – Marcos

+0

.get()。getResult()を使用することを意味しますか?このQuerySnapshotでタスクを構築できますか?ネストされたCollectionReferenceはどうでしょうか? – Marcos

0

@Dougが提案した内容を管理するように管理しました。ありがとうtaskmaster! これははるかに良いです:

db.collection("calendar").get() 
    .continueWith(new Continuation<Task<QuerySnapshot>, Task<?>>() { 
     @Override 
     public Task<?> then(@NonNull Task<Task<QuerySnapshot>> task) throws Exception { 
      List<Task<QuerySnapshot>> tasks = new ArrayList<Task<QuerySnapshot>>(); 
      for (DocumentSnapshot ds : task.getResult().getResult()) 
       tasks.add(ds.getReference().collection("thingstodo").get()); 

      return Tasks.whenAllSuccess(tasks); 
     } 
    }) 
    .addOnCompleteListener(new OnCompleteListener<Task<?>>() { 
     @Override 
     public void onComplete(@NonNull Task<Task<?>> task) { 
      List<QuerySnapshot> lists = (ArrayList<QuerySnapshot>)task.getResult().getResult(); 
      for (QuerySnapshot qs : lists) 
       for (DocumentSnapshot ds: qs) { 
        ScheduledItem item = ds.toObject(ScheduledItem.class); 
        //add to list including day 
        itemsList.add(item); 

       } 

      //list ready to be used! 
     } 
    }); 
関連する問題