我正在制作和应用程序,显示第一个屏幕,其中包含来自Firebase数据库中某个节点的一组随机选取的数据。
每次向用户显示不同的数据对我的应用程序来说很重要
无论如何在原生Android中实现这一点,所有快照都是相同的模型
答案 0 :(得分:1)
不要认为有一种方法可以从Firebase数据库中随机获取数据,因为您可以构建的所有查询最终都会以某种方式确定性,或者基于生成的推送ID(反过来又基于时间)或者按字典顺序排列的其他一些密钥。我认为最好的方法是从节点中获取数据列表并随机选择数据客户端。
答案 1 :(得分:1)
如果没有加载整个列表客户端,实际上有可能这样做。首先,您必须生成数字ID作为子ID或额外节点。 你的数据库看起来如何:
notes:
-KXe8LJJzczEJs3YYwRe
numericid : 001
-KXeePWrWBXvpw4g9n0p
numericid : 002
或
notes:
001
002
将数字创建为String,您可以使用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。
答案 2 :(得分:1)
firebase数据库没有提供直接方法,但您可以使用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
现在你可以用随机化的arraylist做任何你想做的事。