繁体   English   中英

如何在 LIKE_ID、POST_ID + USER_ID 中放入 Firebase

[英]How to put in Firebase in the LIKE_ID, POST_ID + USER_ID

我遇到了一个我自己无法解决的大问题,我需要在 Firebase 中输入我的社交网络应用程序的点赞,id 为 POSTID + USERID,但实际上,我不知道如何带上 postid 并粘贴在喜欢 id(发布键)中。 主要问题是关于 post_key:它给了我一个随机 id 而不是 post id 但老实说,我不知道如何带它,所以结果是 LIKESID = RANDOMID + USERID,而不是 LIKESID = POSTID + USERID 我认为对于专家级程序员来说修复它非常简单,但作为初学者,这让我大吃一惊

Firebase 结构

   public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    ArrayList<Model> mList;
    Context context;

    public MyAdapter(Context context, ArrayList<Model> mList){
        this.mList = mList;
        this.context = context;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.item , parent , false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

      Model model = mList.get(position);
      holder.nickname.setText(model.getNickname());
      holder.date.setText(model.getDate());
      holder.time.setText(model.getTime());
      holder.post.setText(model.getPost());
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder{
        ImageButton like;
        Boolean likechecker = false;
        String currentUserID;
        FirebaseAuth mAuth;
        TextView date, time, nickname, post, liketextview;
        DatabaseReference LikesRef;
        DatabaseReference Database = FirebaseDatabase.getInstance().getReference();
        final String post_key = Database.push().getKey();
        Integer countlikes;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            date = itemView.findViewById(R.id.date_text);
            time = itemView.findViewById(R.id.time_text);
            post = itemView.findViewById(R.id.post_text);
            nickname = itemView.findViewById(R.id.nickname_text);
            like = itemView.findViewById(R.id.like_btn);
            mAuth = FirebaseAuth.getInstance();
            currentUserID = mAuth.getCurrentUser().getUid();
            LikesRef = (FirebaseDatabase.getInstance().getReference().child("Likes"));
            setlikebuttonstatus(post_key);

            like.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                     likechecker = true;

                    LikesRef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                        if(likechecker.equals(true)){
                            if (snapshot.child(post_key).hasChild(currentUserID)){
                                LikesRef.child(post_key).child(currentUserID).removeValue();
                                likechecker = false;
                            }
                            else {
                                LikesRef.child(post_key).child(currentUserID).setValue(true);
                                likechecker = false;
                            }
                        }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                    });
                }
            });
        }

        public void setlikebuttonstatus(final String post_key) {
            post = itemView.findViewById(R.id.post_text);
            liketextview = itemView.findViewById(R.id.like_textview);
            LikesRef = (FirebaseDatabase.getInstance().getReference().child("Likes"));
            mAuth = FirebaseAuth.getInstance();
            currentUserID = mAuth.getCurrentUser().getUid();

            LikesRef.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot snapshot) {
                  if(snapshot.child(post_key).hasChild(currentUserID)){
                     countlikes = (int) snapshot.child(post_key).getChildrenCount();
                     like.setImageResource(R.drawable.like);
                     liketextview.setText(Integer.toString(countlikes) + " Likes");}
                 else {
                     countlikes = (int) snapshot.child(post_key).getChildrenCount();
                     like.setImageResource(R.drawable.notlike);
                     liketextview.setText(Integer.toString(countlikes) + " Likes");
                     }

              }

              @Override
              public void onCancelled(@NonNull DatabaseError error) {

              }
          });
        }


    }
}

主页.Activity

package com.example.scrapbase11;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerAdapter_LifecycleAdapter;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.StorageReference;
import com.squareup.picasso.Picasso;

import java.awt.font.TextAttribute;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.EventListener;
import java.util.HashMap;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

public class HomepageActivity extends AppCompatActivity {
    String currentUserID;
    private FirebaseAuth mAuth;
    private DatabaseReference UsersRef, PostsRef, LikesRef;
    private TextView nicknamedisplayed, displaynumblikes;
    private EditText posttext;
    private CircleImageView circleImageView;
    private Button pubblicabtn;
    private String saveCurrentdate, saveCurrenttime, tsaveCurrentdate, tsaveCurrenttime, postRandomName, nickname;
    private RecyclerView recyclerView;
    private FirebaseDatabase db = FirebaseDatabase.getInstance();
    private DatabaseReference root = db.getReference().child("Posts");
    private DatabaseReference Database = FirebaseDatabase.getInstance().getReference();
    private MyAdapter adapter;
    private ArrayList<Model> list;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_homepage);

        displaynumblikes = (TextView) findViewById(R.id.like_textview);
         nicknamedisplayed = (TextView) findViewById(R.id.nickname_textview);
        posttext = (EditText) findViewById(R.id.postedittext);
        pubblicabtn = (Button) findViewById(R.id.pubblica_btn);
        circleImageView = (CircleImageView) findViewById(R.id.home_profileimage);
        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getCurrentUser().getUid();
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<>();
        adapter = new MyAdapter(this, list);
        recyclerView.setAdapter(adapter);
        Calendar calFordDate = Calendar.getInstance();
        Calendar calFordTime = Calendar.getInstance();
        SimpleDateFormat currentDate = new SimpleDateFormat("dd/MM/yyyy");
        saveCurrentdate = currentDate.format(calFordDate.getTime());
        SimpleDateFormat currentTime = new SimpleDateFormat("HH:mm");
        saveCurrenttime = currentTime.format(calFordTime.getTime());
        final String post_key = Database.push().getKey();

        circleImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Sendtomyprofile();
            }
        });


        nicknamedisplayed.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Sendtomyprofile();
            }
        });
        root.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
             for(DataSnapshot dataSnapshot : snapshot.getChildren()){
                 Model model = dataSnapshot.getValue(Model.class);
                 list.add(model);
             }
             adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

        UsersRef = (FirebaseDatabase.getInstance().getReference().child("Users"));
        PostsRef = (FirebaseDatabase.getInstance().getReference().child("Posts"));
        LikesRef = (FirebaseDatabase.getInstance().getReference().child("Likes"));

        pubblicabtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Savepostmethod();
            }
        });

        // codice per far visualizzare il proprio nickname

        UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(@NonNull DataSnapshot snapshot) {
               if(snapshot.exists()){
                   nickname = snapshot.child("nickname").getValue().toString();

                   nicknamedisplayed.setText("Welcome back " + nickname);
               }
           } 
       // fine del codice per visualizzare il proprio nickname


           @Override
           public void onCancelled(@NonNull DatabaseError error) {
               Toast.makeText(HomepageActivity.this, "Database error :)", Toast.LENGTH_SHORT).show();
           }
       });
    }

    private void Sendtomyprofile() {
        Intent Gotomyprofileintent =new Intent(HomepageActivity.this, ProfileActivity.class);
        startActivity(Gotomyprofileintent);
    }

    private void Savepostmethod() {
        String post = posttext.getText().toString();

        if (TextUtils.isEmpty(post)) {
            Toast.makeText(this, "Please write something...", Toast.LENGTH_SHORT).show();
        } else {
            Calendar tcalFordDate = Calendar.getInstance();
            Calendar tcalFordTime = Calendar.getInstance();

            SimpleDateFormat tcurrentDate = new SimpleDateFormat("ddMMyyyy");
            tsaveCurrentdate = tcurrentDate.format(tcalFordDate.getTime());
            SimpleDateFormat tcurrentTime = new SimpleDateFormat("HHmm");
            tsaveCurrenttime = tcurrentTime.format(tcalFordTime.getTime());

            postRandomName = tsaveCurrentdate + tsaveCurrenttime;
            HashMap postMap = new HashMap();
            postMap.put("userid", currentUserID);
            postMap.put("nickname", nickname);
            postMap.put("post", post);
            postMap.put("time", saveCurrenttime);
            postMap.put("date", saveCurrentdate);
            PostsRef.child(currentUserID + postRandomName).updateChildren(postMap).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()) {
                        Toast.makeText(HomepageActivity.this, "Pubblicazione riuscita", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        Toast.makeText(HomepageActivity.this, "Pubblicazione non riuscita, controlla la tua connessione internet", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }}

问题很明显。 您在这里创建:

final String post_key = Database.push().getKey();

总是一个随机的 Uid。 并在这里使用它:

setlikebuttonstatus(post_key);

如问题中所述,您总是以 LIKESID = RANDOMID + USERID 结束。 您还编写了解决方案:写postUid而不是随机的。

这里的 model 给你的是什么? 它只是一个字符串吗?:

holder.post.setText(model.getPost());

您能否与我们分享您如何获得posts列表,我们可以找到解决方案。 我们基本上只需要每个帖子快照中的key而不是数据。 您可能拥有它,但它没有映射到您的其他代码来获取它。

使用编辑中的代码,您可以获得这样的post uid,并可能添加到Model class 属性id ,然后像这样添加它:

Model model = dataSnapshot.getValue(Model.class);
String key=dataSnapshot.getKey();
model.id=key;
list.add(model);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM