如何在firebase中编写两个查询?

时间:2017-09-17 18:49:16

标签: android firebase firebase-realtime-database android-recyclerview

我想要做的是循环firebase数据库中的所有用户帖子并在recycleler视图中显示它,现在每个帖子都有一个用户ID,为此我需要写第二个查询,它获取特定用户名用户的帖子。

这是json的外观

我现在所做的就是这个

list = new ArrayList < > ();

newsFeedRecyclerView = (RecyclerView) 
findViewById(R.id.news_feed_recyclerview);

newsFeedRecyclerView.setHasFixedSize(true);
newsFeedRecyclerView.setLayoutManager(new 
LinearLayoutManager(this));
newsFeedListAdapter = new NewsFeedListAdapter(list, 
images);
newsFeedRecyclerView.setAdapter(newsFeedListAdapter);

Query query = databaseReference.child("Posts");
query.addListenerForSingleValueEvent(new 
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {


    for (DataSnapshot data: dataSnapshot.getChildren()) {

        final PostsPOJO postsPOJO = data.getValue(PostsPOJO.class);
        images = postsPOJO.getcontent_post();

        Query userDetails = databaseReference.child("Users/" + postsPOJO.getUserID());


        userDetails.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String username = dataSnapshot.child("Username").getValue(String.class);
                String profilePicturePath = dataSnapshot.child("ProfilePicture").getValue(String.class);

                list.add(new PostsPOJO(postsPOJO.getUserID(), profilePicturePath, username, postsPOJO.getTimestamp(), postsPOJO.getPostText(), postsPOJO.getLocation(), postsPOJO.getcontent_post()));
                newsFeedListAdapter.notifyDataSetChanged();


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

}

@Override
public void onCancelled(DatabaseError databaseError) {
   }
});

但问题在于它显示所有帖子首先其用户ID首先出现,因为第二篇帖子的用户不同。 例如(如果用户ID 1 = john和用户ID 2 = alex,它首先显示约翰的所有帖子,然后显示亚历克斯的帖子。

有人可以帮忙吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您的方法非常以“关系数据库”为导向。您不应该害怕对数据进行非规范化并将数次写入相同的数据。

换句话说,不要在Post节点下放置UserId,只需输入用户的用户名即可。然后,您只需要循环一次以列出具有用户名的帖子。

假设您想要显示手机号码和帖子的用户名。您也可以在Post节点下编写Mobile编号,就像您对Username所做的那样。再一次,在一个循环中,您将获得所需的一切。

答案 1 :(得分:0)

您正在设置单个值事件侦听器,因此当用户单击该帖子时,用于获取该特定用户的帖子的代码仅执行一次。

您可以使用this帖子来设置RecyclerView的onClick并编写以下代码,而不是这种方法:

  newsFeedRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        Log.w(TAG, "You clicked on "+position);
        PostPojo postPojo = (PostPojo) list.get(position);
        String userId = postPojo.getUserId();
        // now is the time to fetch all posts of the above userId

    }
}));