2016-11-28 121 views
0

我正在制作和展示第一个屏幕,其中包含一堆从Firebase数据库中的节点中随机挑选的数据。Firebase - 随机查询

为了呈现不同的数据用户每次是一种适合我的应用

的重要反正在原生的Android来实现这一点,所有的快照是同一型号的

+0

您是否找到答案? – UmarZaii

+0

nope,对于一个昂贵的方法,请参阅@makrand pawar的答案 –

回答

1

不要以为有一个从Firebase数据库中随机获取数据的方式,因为您可以基于生成的推式ID(其基于时间)或按字典顺序排列的某些其他键以某种方式确定性地确定所有查询。我认为最好的办法是从节点获取数据列表并随机选择数据客户端。

1

实际上有可能做到这一点,而无需加载整个列表客户端。首先,您必须生成一个数字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。

+0

我不确定这是否是一个有效的解决方案,如果我有大约1000个帖子,我需要一个5个随机帖子,我将不得不拉所有1000个帖子或ID的列表,让他们5出来 –

+0

我不知道我是否理解你的权利,但用这种方法,你不拉列表,只是检查有多少孩子在快照中,应该比加载整个列表更有效率。 – Hhorn

1

有由火力数据库提供的没有直接的方法,但你可以做到这一点使用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 

现在你可以做任何你想要的这个随机数组列表。

+0

这种方法唯一的问题是,比如说你有1000多件物品,而你只需要8件穿梭物品(我的情况)。这种方法可以工作,但它会从服务器获取所有1000+,这是相当和开销 –

+0

是的......我也在寻找这个相同的答案......只是想给你一个选项,同时我们得到答案。 –