要素がFirestore文書内の配列に挿入されていない場合でも、なぜsuccessListenerが呼ばれているのですか?

Jayeshバブ:

私は、クラウドFirestore文書内の配列にはuserIdを追加するには、次のコードを使用します。

DocumentReference reference = firebaseFirestore.collection("photos").document(photoId);
reference.update("views", FieldValue.arrayUnion(currentUser.getUid()))
        .addOnSuccessListener(new OnSuccessListener<Void>()
        {
            @Override
            public void onSuccess(Void aVoid)
            {
                reference.update("viewsCount", FieldValue.increment(1));
            }
        });

あなたがコードから見ることができるように、私が欲しいviewsCountの要素が追加されている場合にのみインクリメントするviews配列。

これによると、追加データ、文書、arrayUnion()ない既に存在している配列だけの要素に要素を追加して、私が望んでいたまさにthatsの。

しかし、問題は、私は、配列の中にすでに存在する要素を追加したときに、要素が挿入されていないが、それであるaddOnSuccessListenerと呼ばれ、viewsCountインクリメントされ、failureListenerが呼び出されることはありません。これを回避する方法はありますか?私がしたいviewsCount要素が挿入されたときにのみインクリメントされるようにviews配列。

アレックス・マモ:

しかし、問題は、私は、配列の中にすでに存在する要素を追加したときに、要素が挿入されていないが、それであるaddOnSuccessListenerと呼ばれ、viewsCountがインクリメントされ、failureListener呼び出されることはありません。

これは正常な動作です。ことに注意してくださいOnSuccessListenerあなたが現在あなたがその特定の操作の最終結果が成功した場合にのみ、データベース内で行われていることを操作するために呼ばれて使用されていること。

あなたの特定のケースには:

.update("views", FieldValue.arrayUnion(currentUser.getUid())

OnSuccessListener追加された操作の後に呼び出されuid、あなたにviews、アレイが成功しました。それがあれば、それは本当に問題ではありませんuidがたりないすでにでした、全体の操作が成功しました。それは事実だuid配列に追加されませんでしたが、にもかかわらず、操作が成功しました。

予想通り、タスクによって表される作業がエラーなしで、終了したときに、タスクが成功したとみなされていること、rememeberもしてください。一方、OnFailureListenerタスク例外で失敗したときに呼び出されます。だから、結果や例外、決して両方にすることができます。追加だから、uidすでに配列のexsistsが失敗をcosideredすることはできませんことを。

この問題を解決するには、あなたが作成する必要がありget()、コールをドキュメント全体を取得してのexistnceをチェックuidしてviews、アレイ。それが存在しない場合は、更新を作成して、カウンタをインクリメント、そうでない場合は何もアクションを取ることはありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=312327&siteId=1
おすすめ