2016-11-28 115 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

是的......我也在尋找這個相同的答案......只是想給你一個選項,同時我們得到答案。 –