2015-12-02 55 views
3

下面是數據結構如下:Firebase中equalTo(「value」,「key」)的用法?

{ 
    "list" : { 
    "-K4YlfoWHZqPyWONv68Y" : { 
     ".priority" : -1.449077948445E12, 
     "date" : 1449077948445, 
     "id" : "0", 
     "name" : "Name_0" 
    }, 
    "-K4YlfoWHZqPyWONv68Z" : { 
     ".priority" : -1.449077948445E12, 
     "date" : 1449077948445, 
     "id" : "1", 
     "name" : "Name_1" 
    }, 
    "-K4YlfoWHZqPyWONv68_" : { 
     ".priority" : -1.449077948445E12, 
     "date" : 1449077948445, 
     "id" : "0", 
     "name" : "Name_2" 
    }, 
    "-K4YlfoWHZqPyWONv68a" : { 
     ".priority" : -1.449077948445E12, 
     "date" : 1449077948445, 
     "id" : "1", 
     "name" : "Name_3" 
    }, 
... 
} 

我需要其中id是「0」,只拿到項目;

以下工作:

final Firebase ref = new Firebase("https://millezim-test.firebaseio.com/").child("list"); 

ref.orderByChild("id").equalTo("1").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot d : dataSnapshot.getChildren()) { 
      Model m = d.getValue(Model.class); 
     } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

     } 
}); 

但沒有這一項,爲什麼呢?

ref.equalTo("1","id").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot d : dataSnapshot.getChildren()) { 
      Model m = d.getValue(Model.class); 
     } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

     } 
}); 

難道我誤會equalTo(「價值」,「鍵」)是沒有重新排序使用的東西?

回答

4

Firebase documentation for equalTo說,這對(可選)key參數:

的子鍵在啓動,與先前指定的優先級的兒童。只有按優先順序排序,才允許使用此參數。

由於您沒有按優先順序排序,因此您需要指定子女,並明確致電orderByChild()

+0

在Android部分,沒有這樣的細節https://www.firebase.com/docs/android/api/#query_equalTo – Anthony

+0

爲了確保理解,「key」是「list's item key」的起點,只考慮基於優先級的請求? – Anthony

+0

我也無法解析該子句。但我總是使用'orderByChild()',所以從未遇到過這個問題。 –

0

equalTo的實現看起來是這樣的:

public Query equalTo(String var1, String var2) { 
    this.zzbpu(); 
    return this.startAt(var1, var2).endAt(var1, var2); 
} 

似乎沒有順序可言,所以你必須預先訂購它。

相關問題