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

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

我想做的是循环 firebase 数据库中的所有用户帖子并在回收器 View 中显示它,现在每个帖子都有一个用户 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 在前的帖子。 例如(如果 userid 1 = john 和 userid 2 = alex,它首先显示 john 的所有帖子,然后显示 alex 的帖子。

有人可以帮忙吗?

谢谢。

最佳答案

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

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

假设您要显示手机号码和帖子的用户名。您也可以在 Post 节点下写入手机号码,就像您为用户名所做的那样。同样,在一个循环中,您可以获得所需的一切。

关于android - 如何在 firebase 中编写两个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267684/

相关文章:

android - 如何保护 OAuth 消费者 secret 的安全,以及当它被泄露时如何 react ?

android - leanback 版本升级到 25.0.1 导致 guidedStepFragment 崩溃

ios - Firebase 的 iOS 离线功能与核心数据

android - 如何使 .getCurrentUser() 返回非空?

firebase - 如何使用 firebase 功能而不是管理员身份在数据库中写入

android - 在没有互联网的设备上通过 Firebase 隐藏 ProgressDialog

android - 为什么我的 Android 应用程序从扩展坞中取出后会重新启动?

java - 避免间接和冗余的方法调用

android - 如何从 Firebase 检索数据和特定用户数据

android - 无法按时间戳对 firebase 实时数据库中的数据进行排序