如何从 firebase 实时数据库中获取子值?

Posted

技术标签:

【中文标题】如何从 firebase 实时数据库中获取子值?【英文标题】:How can get the child values from firebase realtime database? 【发布时间】:2021-11-04 10:16:46 【问题描述】:

如何从 Firebase 实时数据库中获取子值?

下面是我的架构:

Posts
|--firebase key
   |--title: test1
   |--sub: NY
   |--country: USA
 --firebase key
   |--title: test2
   |--sub: DC
   |--country: USA
 --firebase key
   |--title: test3
   |--sub: DC
   |--country: USA
 --firebase key
   |--title: test4
   |--sub: FRA
   |--country: EU
 --firebase key
   |--title: test5
   |--sub: UK
   |--country: EU

我想读取sub的值,但是像DC一样一共有三个值,但是我只想取一次,因为我想要实现的是有值的状态会显示在RecyclerView中,但是像AL、AZ、AL、AR等,还没有添加,所以不会显示。

那我该怎么做呢?

我会用这个方法来获取post country,那么如何显示subs呢?

DatabaseReference countryRef = FirebaseDatabase.getInstance().getReference("Posts");
        Query query = countryRef.orderByChild("country").equalTo(country);
        query.addListenerForSingleValueEvent(new ValueEventListener() 
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
                
            

            @Override
            public void onCancelled(@NonNull DatabaseError error) 

            
        );

【问题讨论】:

【参考方案1】:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("Posts");
postsRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() 
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) 
        if (task.isSuccessful()) 
            List<String> posts = new ArrayList<>();
            for (DataSnapshot ds : task.getResult().getChildren()) 
                String sub = ds.child("sub").getValue(String.class);
                if(!posts.contains(sub)) 
                    posts.add(sub);
                
            
            for (String post : posts) 
                Log.d("TAG", post);
            
         else 
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        
    
);

logcat 中的结果将是:

NY
DC
AK

如果您想在 android 中的 RecyclerView 中显示这些结果,您应该考虑使用我在以下帖子中的回答:

How to display data from Firestore in a RecyclerView with Android?

【讨论】:

我希望只显示 NY、DC、AK。 在这种情况下,请查看我的更新答案。 logcat 中的结果不会包含重复项。现在可以了吗? 谢谢兄弟,但我忘记了非常重要的事情。我更新了我的上下文。因为我会有很多国家信息,如果用户选择美国那么它只是显示美国子,但如果用户选择欧盟那么它需要显示欧盟 我已经更新了我的上下文,你能检查一下吗? 如果您在读取数据方面遇到其他问题,请不要编辑实际问题,而是使用自己的MCVE 发布新问题,以便我和其他 Firebase 开发人员可以帮助您。跨度> 【参考方案2】:

首先使用此代码获取数据库引用

private DatabaseRefrence mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();

您可以使用此代码轻松获取孩子

mFirstChild = mDatabase.child("child-name");
mSecondChild = mFirstChild.child("2-child-name");

【讨论】:

我可以使用模型吗?因为我想在回收站视图中展示和使用 CardView。

以上是关于如何从 firebase 实时数据库中获取子值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用两个子值在 Firebase 中进行搜索?

从 Firebase 查询具有在 ArrayList 中找到的子值的对象

如何获取内部子值 Firebase?

如何读取 Firebase 子值?

如何使用 Cloud Functions for Firebase 获取子值的键?

Firebase 和 Swift 如何按子值提取特定记录?