如何获得 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()
直到迭代器位于n
th 位置(其中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 节点的随机子节点?的主要内容,如果未能解决你的问题,请参考以下文章