私は、クラウド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
、アレイ。それが存在しない場合は、更新を作成して、カウンタをインクリメント、そうでない場合は何もアクションを取ることはありません。