2016-12-10 4 views
2

これは一般的なエラーであり、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回呼び出しています。

引数

  1. それが失敗した場合、それは両方のノード/ユーザー投稿/と/ポスト/のために失敗する必要があります。なぜそれは両方の場所で失敗していないのですか?
  2. 唯一のような初回は失敗しますが、>嫌い>好き>嫌いのように連続して実行すると、2回目以降の病棟で成功します。なぜそうなのか?
  3. 最も重要:このエラーは、友人が作成した投稿が好きなときにのみ表示されます。私自身の投稿が好きなら、エラーはありません。
+0

私の場合。私は自分の電話に2つのGoogleアカウントを登録しています。その後、私は自分のアプリ内でアカウントを切り替えました。そして、このエラーは私のカウンターの1つ(トランザクションを使用して)に上がり始めました。 しかし、2回呼び出すことで回避策が働いた。奇妙なことは正しい? – Atu

+0

その奇妙な、さらに私のバグのように思えます。 Firebaseチームによって明らかにされるかもしれない。 –

答えて

-1

次の回避策で問題を解決しました。これが適切な方法であるかどうかは分かりませんが、より良い解決策があるかどうかを他の人から知ることが大好きです。

1回目のトランザクションでのみ発生するので、2回目の試行で成功したエラーを確認し、同じ操作をもう一度やり直そうとしています。

@Override 
     public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) { 
      // Transaction completed 
      Log.d(TAG, "updateLikeInServer:onComplete: " + databaseError); 
      if (databaseError != null && databaseError.getCode() == DatabaseError.OVERRIDDEN_BY_SET) { 
       // Retry the same 
       updateLikeInServer(dbRef, userId); 
      } 
     } 

上記のスニペットが私の問題を解決しました。しかし、私は可能な限り最良の答えを聞くのが大好きです。

+1

私はそれを誰が知っていません。しかし、おそらくより良い解決策を聞くことが大好きです。なぜなら、これは良い解決策ではないとわかっていて、正しい解決策を見つけているからです。 –

関連する問題