これは一般的なエラーであり、SOには多くのスレッドが存在することがわかりました。しかし何も私を助けませんでした。ここでデータベースエラー:トランザクションが後続のセットによってオーバーライドされました
は私の問題です:
私のDB構造: likeCount 同類> ID:真 ルート /ポスト/ /ユーザー投稿/ユーザーID/
各ポストは、以下を含むいくつかの属性を持っています
投稿が作成されるたびに、/ posts /と/ user-posts/nodeの両方に格納されます。しかし、私が投稿を好きになると、それは1つで更新され、質問タイトルに記載されているエラーで別のものに失敗します。 firebase DBにポストを挿入するために使用
コード:
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/posts/" + key, feedValues);
childUpdates.put("/user-posts/" + userId + "/" + key, feedValues);
dbRef.updateChildren(childUpdates);
が
コードは次のように使用:のようなカウントは、両方で更新する必要があるため
public static void updateLikeInServer(DatabaseReference dbRef, final String userId) {
Log.d(TAG, "updateLikeInServer:started:");
dbRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
Post post = mutableData.getValue(Post.class);
if (post == null) { // It comes as null for /user-posts/ but not for /posts/
return Transaction.success(mutableData);
}
if (post.getLikes().containsKey(userId)) {
post.setLikesCount(post.getLikesCount() - 1);
post.getLikes().remove(userId);
} else {
post.setLikesCount(post.getLikesCount() + 1);
post.getLikes().put(userId, true);
}
// Set value and report transaction success
mutableData.setValue(post);
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "updateLikeInServer:onComplete: " + databaseError);
}
});
}
/ユーザー投稿/と/ posts /、上記のメソッドを対応するDatabaseReferenceで2回呼び出しています。
引数:
- それが失敗した場合、それは両方のノード/ユーザー投稿/と/ポスト/のために失敗する必要があります。なぜそれは両方の場所で失敗していないのですか?
- 唯一のような初回は失敗しますが、>嫌い>好き>嫌いのように連続して実行すると、2回目以降の病棟で成功します。なぜそうなのか?
- 最も重要:このエラーは、友人が作成した投稿が好きなときにのみ表示されます。私自身の投稿が好きなら、エラーはありません。
私の場合。私は自分の電話に2つのGoogleアカウントを登録しています。その後、私は自分のアプリ内でアカウントを切り替えました。そして、このエラーは私のカウンターの1つ(トランザクションを使用して)に上がり始めました。 しかし、2回呼び出すことで回避策が働いた。奇妙なことは正しい? – Atu
その奇妙な、さらに私のバグのように思えます。 Firebaseチームによって明らかにされるかもしれない。 –