简体   繁体   中英

Android Firebase - How to make query

I'm doing saving post feature now. I want display all saved post in one activity. I have made an activity where is RecyclerView in which I store all of posts and I have made made PostRow activity already. I have this databse: 数据库 . I want to get all post which user has saved and i dont know how to get them from database. I have made PostAdapter:

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder>{

private List<Post> mPostList;

private boolean mProcessLike = false;

private String mSinglePostId;

private Context mCtx;

private DatabaseReference mDatabaseUsers;
private FirebaseUser mCurrentUser;

public PostAdapter (List<Post> postList, DatabaseReference databaseUsers, Context ctx){
    this.mPostList = postList;
    this.mDatabaseUsers = databaseUsers;
    this.mCtx = ctx;

    this.mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
}

@Override
public PostAdapter.PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.post_row, parent, false);

    PostViewHolder postViewHolder = new PostViewHolder(v);

    return postViewHolder;
}

@Override
public void onBindViewHolder(final PostAdapter.PostViewHolder holder, int position) {

    Post post = mPostList.get(position);

    holder.setTitle(post.getTitle());
    holder.setImage(post.getImage());

    holder.setPostId(post.getPostId());

    holder.setLikeButton(holder.getPostId());

    holder.getView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent postSingle = new Intent(mCtx, SinglePostActivity.class);
            postSingle.putExtra("postId", holder.getPostId());
            mCtx.startActivity(postSingle);

        }
    });

    holder.getLikeBtn().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            mProcessLike = true;

            mDatabaseUsers.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if (mProcessLike){

                        if(dataSnapshot.child("saved").hasChild(holder.getPostId())){

                            mDatabaseUsers.child("saved")
                                          .child(holder.getPostId())
                                          .removeValue();

                            mProcessLike = false;

                        }else {

                            mDatabaseUsers.child("saved")
                                          .child(holder.getPostId())
                                          .setValue("saved");

                            mProcessLike = false;

                        }

                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }
    });

}

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

public static class PostViewHolder extends RecyclerView.ViewHolder{

    private TextView mPostTitle;
    private ImageView mPostImage;

    private Context mCtx;

    private DatabaseReference mDatabaseUsers;
    private FirebaseUser mCurrentUser;

    private ImageButton mLikeBtn;

    private String postId;

    private View mView;

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

        this.mPostTitle = (TextView) itemView.findViewById(R.id.post_title);
        this.mPostImage = (ImageView) itemView.findViewById(R.id.post_image);

        this.mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
        this.mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users").child(mCurrentUser.getUid());

        this.mLikeBtn = (ImageButton) itemView.findViewById(R.id.like_btn);

        this.mCtx = itemView.getContext();

        this.mView = itemView;

    }

    public void setTitle(String title){
        mPostTitle.setText(title);
    }

    public void setImage(String image){
        Picasso.with(mCtx).load(image).into(mPostImage);
    }

    public void setPostId(String id){
        this.postId = id;
    }

    public String getPostId(){
        return this.postId;
    }

    public void setLikeButton(final String postKey) {

        mDatabaseUsers.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if(dataSnapshot.child("saved").hasChild(postKey)){
                    mLikeBtn.setImageResource(R.drawable.ic_favorite_pink_48dp);
                }else{
                    mLikeBtn.setImageResource(R.drawable.ic_favorite_black_24dp);
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    public ImageButton getLikeBtn() {
        return this.mLikeBtn;
    }

    public View getView() {
        return this.mView;
    }

}
}

I recommend changing your database structure, more specifically on the books node, to something like this:

{
    "books":{
        "2ExF2vKltibqCbE0oVOEHkYSRi2":{ /* the user key*/
            /*list of books saved by that user*/
            "-L2L2UgB...":{
                "title":"Title goes here"
            },
            "-anotherBookKey":{
                "title":"Title goes here"
            }
        },
        "anotherUserKey":{
            "hisSavedBookKey":{
                "title":"Title goes here"
            }
        }
    },
    "users" : {
        "2ExF2vKltibqCbE0oVOEHkYSRi2" : {
            "image" : "...",
            "name" : "Karol546",
            "saved" : {
                "-L2L2UgB...":"saved"
            },
            "thumb_image" : "default"
        },
    }
}

And when you want to list all books saved by the user 2ExF2vKltibqCbE0oVOEHkYSRi2 , you'd use this DatabaseReference:

String userId = "2ExF2vKltibqCbE0oVOEHkYSRi2";
DatabaseReference savedRef = FirebaseDatabase.getInstance()
            .getReference().child("books").child(userId);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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