我正在制作和展示第一个屏幕,其中包含一堆从Firebase数据库中的节点中随机挑选的数据。Firebase - 随机查询
为了呈现不同的数据用户每次是一种适合我的应用
的重要反正在原生的Android来实现这一点,所有的快照是同一型号的
我正在制作和展示第一个屏幕,其中包含一堆从Firebase数据库中的节点中随机挑选的数据。Firebase - 随机查询
为了呈现不同的数据用户每次是一种适合我的应用
的重要反正在原生的Android来实现这一点,所有的快照是同一型号的
不要以为有一个从Firebase数据库中随机获取数据的方式,因为您可以基于生成的推式ID(其基于时间)或按字典顺序排列的某些其他键以某种方式确定性地确定所有查询。我认为最好的办法是从节点获取数据列表并随机选择数据客户端。
实际上有可能做到这一点,而无需加载整个列表客户端。首先,您必须生成一个数字ID作为子ID或作为一个额外的节点。 您的数据库会是什么样子:
notes:
-KXe8LJJzczEJs3YYwRe
numericid : 001
-KXeePWrWBXvpw4g9n0p
numericid : 002
或
notes:
001
002
创建的字符串,你可以使用的DecimalFormat
String newint = new DecimalFormat("000").format(oldint);
现在你可以在孩子的数数你的valueeventlistener使用Math.random()来获得一个随机的孩子,例如第二个数据库设计
FirebaseDatabase().getInstance().getReference().child("notes").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Long childrencount = dataSnapshot.getChildrenCount();
if(childrencount.equals(0))return;
int random = getRandomInteger(safeLongToInt(childrencount), 1);
String selectedchild = new DecimalFormat("000").format(random);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
您还需要添加这些safeLongtoInt和getRandomInteger
public static int getRandomInteger(int maximum, int minimum){
return ((int) (Math.random()*(maximum - minimum))) + minimum;
}
public static int safeLongToInt(long l) {
if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
throw new IllegalArgumentException
(l + " cannot be cast to int without changing its value.");
}
return (int) l;
}
selectedchild是你的任意一个孩子的ID。
我不确定这是否是一个有效的解决方案,如果我有大约1000个帖子,我需要一个5个随机帖子,我将不得不拉所有1000个帖子或ID的列表,让他们5出来 –
我不知道我是否理解你的权利,但用这种方法,你不拉列表,只是检查有多少孩子在快照中,应该比加载整个列表更有效率。 – Hhorn
有由火力数据库提供的没有直接的方法,但你可以做到这一点使用Collections.shuffle()
我所做的就是,拍摄快照,并将其存储在一个ArrayList。
private ArrayList<Integer> array=new ArrayList<>();
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot imageSnapshot : dataSnapshot.getChildren()) {
MyClass myclass = imageSnapshot.getValue(MyClass.class);
array.add(myclass.someFunction());
}
}
然后在此数组列表上调用shuffle方法。
Collections.shuffle(array); // randomize the arraylist
现在你可以做任何你想要的这个随机数组列表。
这种方法唯一的问题是,比如说你有1000多件物品,而你只需要8件穿梭物品(我的情况)。这种方法可以工作,但它会从服务器获取所有1000+,这是相当和开销 –
是的......我也在寻找这个相同的答案......只是想给你一个选项,同时我们得到答案。 –
您是否找到答案? – UmarZaii
nope,对于一个昂贵的方法,请参阅@makrand pawar的答案 –