如何获得 Firebase 节点的随机子节点?

Posted

技术标签:

【中文标题】如何获得 Firebase 节点的随机子节点?【英文标题】:How does one get a random children of a Firebase node? 【发布时间】:2017-03-26 22:00:29 【问题描述】:

首先,这是我的数据库结构:

我的目标是从“DE”节点获取一个随机的 Question 对象,以便稍后显示它,并且由于没有内置支持查询随机子项,我必须自己从该迭代器中获取一个随机对象,以某种方式。

目前,我有这段代码,但对如何将它串在一起感到困惑:

    DatabaseReference questionsRef = FirebaseDatabase.getInstance().getReference().child("questions").child("DE");

questionsRef.addListenerForSingleValueEvent(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        int questionCount = (int) dataSnapshot.getChildrenCount();
        int rand = random.nextInt(questionCount);
        Iterator itr = dataSnapshot.getChildren().iterator();
    
    // onCancelled()
);

【问题讨论】:

见***.com/q/40765613或***.com/q/40853157或***.com/q/42186839 @FrankvanPuffelen 谢谢,我相信只有第三个链接实际上是我要问的(第一个和第二个问题不是这个),在那个解决方案中,它首先创建一个列表,然后添加所有内容对它,只是为了拿回一件事。 【参考方案1】:

基本上,你只需要做足够的itr.next() 直到迭代器位于nth 位置(其中n 是来自nextInt() 的随机数),然后你就可以简单地得到你想要的对象getValue(),下面的例子应该可以很好地展示它:

questionsRef = FirebaseDatabase.getInstance().getReference().child("questions").child("DE");

questionsRef.addListenerForSingleValueEvent(new ValueEventListener() 
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) 
        int questionCount = (int) dataSnapshot.getChildrenCount();
        int rand = random.nextInt(questionCount);
        Iterator itr = dataSnapshot.getChildren().iterator();

        for(int i = 0; i < rand; i++) 
            itr.next();
        
        childSnapshot = (DataSnapshot) itr.next();
        question = childSnapshot.getValue(Question.class);
    

    @Override
    public void onCancelled(DatabaseError databaseError) 

    
);

【讨论】:

如果你的数据库很大,你可以使用Firebase Functions来达到这个目的!

以上是关于如何获得 Firebase 节点的随机子节点?的主要内容,如果未能解决你的问题,请参考以下文章

计算特定XML节点c#的子节点数[重复]

R中的随机子空间方法

如何访问 Firebase 实时数据库中子节点的父节点?

高手帮忙:sql 里怎样递归判断父节点和子节

如何对firebase firestore中的节点求和?

如何使用 XPATH for XML 获取子节点数