2017-08-23 3 views
0

私はソーシャルメディアアプリを作っています。ユーザーはさまざまな投稿にコメントできるようになります。Firebaseからコメントをアップロードしたり、 1回のユーザーコメントは1回のみです。 1人のユーザーが2回以上コメントした場合、コメント行は前のコメントよりも優先されます。以下は、ここに私のデータベース構造 enter image description herefirebaseを使用して1人のユーザーに複数回コメントを付ける方法

はfirebaseにデータを送信するために私のコードです:

private void sendComment() { 
      final String message=myComment.getText().toString(); 
      if (!TextUtils.isEmpty(message)) 
      { 
       DatabaseComment.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         DatabaseComment.child(mPostKey).child(mAuth.getCurrentUser().getUid()).child("comments").setValue(message); 

         hDatabase.addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           DatabaseComment.child(mPostKey).child(mAuth.getCurrentUser().getUid()).child("othersName") 
             .setValue(dataSnapshot.child(mAuth.getCurrentUser().getUid()).child("name").getValue()); 
           DatabaseComment.child(mPostKey).child(mAuth.getCurrentUser().getUid()).child("othersDP") 
             .setValue(dataSnapshot.child(mAuth.getCurrentUser().getUid()).child("DP").getValue()); 
          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 

          } 
         }); 
        } 


        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); 
      } 
     } 

これはONSTART方法で私のFirebaseリサイクラーアダプタです:

FirebaseRecyclerAdapter<Profile,ProfileViewHolder> firebaseRecyclerAdapter=new FirebaseRecyclerAdapter<Profile, ProfileViewHolder>(

      Profile.class, 
      R.layout.commentttt_row, 
      ProfileViewHolder.class, 
      DatabaseCommenttttt 
    ) { 

     @Override 
     protected void populateViewHolder(final ProfileViewHolder viewHolder, final Profile model, int position) { 

      viewHolder.setComments(model.getComments()); 
      viewHolder.setOthersName(model.getOthersName()); 
      viewHolder.setOthersDP(model.getOthersDP()); 
     } 

    }; 

    mProfileList.setLayoutManager(mLayoutManager); 
    mProfileList.setAdapter(firebaseRecyclerAdapter); 

と、この私のViewHolderクラス:

public static class ProfileViewHolder extends RecyclerView.ViewHolder 
{ 
    View mView; 

    LinearLayout mLinearName; 
    TextView userName; 
    TextView mComment; 

    public ProfileViewHolder(View itemView) { 
     super(itemView); 

     mView=itemView; 

     userName=(TextView) mView.findViewById(R.id.post_name); 
     mLinearName=(LinearLayout) mView.findViewById(R.id.layout_name); 
     mComment=(TextView) mView.findViewById(R.id.comment); 

    } 

    public void setComments(String name) 
    { 
     TextView post_phone=(TextView) mView.findViewById(R.id.others_comments); 
     post_phone.setText(name); 
    } 
    public void setOthersName(String othersName) { 
     TextView post_name=(TextView) mView.findViewById(R.id.others_name); 
     post_name.setText(othersName); 
    } 

    public void setOthersDP(String othersDP) { 
     CircleImageView post_dp=(CircleImageView) mView.findViewById(R.id.othersaccountImageButton); 
     if (!othersDP.equals("default")) 
      Picasso.with(mView.getContext()).load(othersDP).into(post_dp); 
    } 
} 
+0

あなたの 'POST'構造にそれらを保存します同じように見える。あなたは別のものに考えるべきです。 –

答えて

0

これは、 updateChildren()メソッドを使用する代わりにsetvalue()メソッドを使用しています。 FirebaseはJSON databaseであり、キーと値のparisとして構成されているため、すべてのノードはMapです。したがって、Mapの場合は、古い値が新しい値に置き換えられます。

これを解決するには、setvalue()メソッドの代わりにupdateChildren()メソッドを使用してください。これはHashMapを使用した例です。

Map<String, Object> map = new HashMap<>(); 
map.put("/one-node/", oneStringValue); 
map.put("/another-node/", anotherStringValue); 
mDatabase.updateChildren(map); 

希望します。

+0

しかし、どのようにupdatChildrenメソッドに文字列を渡すことができますか? –

+0

最新の回答をご覧ください。 ''/one-node/''と ''/another-node/''が更新が必要な実際の参照であることに注意してください。 'oneStringValue'と' anotherStringValue'は、更新が必要な実際の値です。 –

+0

はい私は解決しました –

0

コメントを付けた各ユーザーの内部に別のノードを作成する必要があります。したがって、構造はユーザーキーとなり、コメントごとに一意のキーを分離します。コメントを保持するクラスを作成し、個々のユーザーの内部にそのクラスをプッシュします。

public class Comment() { 
    String name; 
    String othersDp; 
    String dP; 

    Comment(String n, String o, String d) { 
     name = n; 
     othersDp = o; 
     dP = d; 
    } 
} 

は、これらの変数を初期化し、データベース内でこのクラスをプッシュ:

Comment newComment = new Comments("Hello","BLA","BLA"); 
DatabaseComment 
    .child(mPostKey) 
    .child(mAuth.getCurrentUser().getUid()) 
    .child("othersName") 
    .setValue(dataSnapshot.child(mAuth.getCurrentUser().getUid()) 
    .push() 
    .setValue(newComments); 
+0

コメント------>投稿---------ユーザー--------> UniqueCommentKey ----->コメント –

+0

ユニークなコメントキーはどうやって入手できますか? –

+0

コードに書いたようにpush()を使用すると、Firebaseはそのノードの一意のキーを自動的に生成します –

0

あなたのデータベースにリスナーを設定する必要があります。

Arraylist<Comment> commentArray = new ArrayList<Comment>(); 
for (DataSnapshot postSnapshot: dataSnapshot.child("Comments").child(Userid).getChildren()) { 
    Comment individualComment = postSnapshot.getValue(Comment.class); 
    commentArray.add(individualComment); 
} 

このコードは、ループは、各コメントをループになっているだろうとコメントクラスの各コメントノードを保存し、かなり良いが、あなたがやりたいことではないのArrayList

+0

私はこのコードをhDatabase、addValueEventListenerに入れましたが、デバッグ後にcommentArray size = 0と書かれています。 –

+0

私はこのことを初めて知りました。あなたの助けが高く評価されます。 –

関連する問題