Firebase - 随机查询

时间:2016-11-28 20:45:55

标签: android random firebase firebase-realtime-database

我正在制作和应用程序,显示第一个屏幕,其中包含来自Firebase数据库中某个节点的一组随机选取的数据。

每次向用户显示不同的数据对我的应用程序来说很重要

无论如何在原生Android中实现这一点,所有快照都是相同的模型

3 个答案:

答案 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做任何你想做的事。