2017-08-11 95 views
1

我想通過使用orderByChild進行查詢並使用這些子項的鍵進行篩選。在這種情況下,我的鍵和值都是用於查詢我想要的數據。如何使用startAt(double value,String key)和endAt(double value,String key)Android中的Firebase實時數據庫

我的問題是當鑰匙包含數字,如果鑰匙只有字母,則沒有問題。因爲我直接從火焰閱讀器讀取another answer中的建議,所以我試圖始終保持數字上的字母。

我的JSON是:

{ 
    "my_list":{ 
    "100xyz":{ 
     "value1": 100, 
     "value2": 100, 
     "name":"100xyz" 
    }, 
    "200xyz":{ 
     "value1": 200, 
     "value2": 200, 
     "name":"200xyz" 
    }, 
    "300xyz":{ 
     "value1": 300, 
     "value2": 300, 
     "name":"300xyz" 
    }, 
    "400xyz":{ 
     "value1": 400, 
     "value2": 400, 
     "name":"400xyz" 
    }, 
    "500xyz":{ 
     "value1": 500, 
     "value2": 500, 
     "name":"500xyz" 
    } 
    } 
} 

我的代碼是:

DatabaseReference root = FirebaseDatabase.getInstance().getReference().getRoot(); 
DatabaseReference list = root.child("my_list"); 
list.orderByChild("value2").startAt(100, "100xyz").endAt(500, "200xyz").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     SomeModel someModel = dataSnapshot.getValue(SomeModel.class); 
     Log.d("SOME_MODEL", someModel.getName()); 
    } 
}); 

的問題是,我可以看到4個孩子的控制檯:

D/SOME_MODEL: 100xyz 
D/SOME_MODEL: 200xyz 
D/SOME_MODEL: 300xyz 
D/SOME_MODEL: 400xyz 

但我只應看過2

D/SOME_MODEL: 100xyz 
D/SOME_MODEL: 200xyz 

我想強調一下:只要鍵沒有數字,它確實有效。

如何通過orderByChild和鍵同時按鍵有數字來過濾?

+0

因爲我很可能是您談論的問題中回答的Firebaser(當您提到另一個問題時,總是會欣賞鏈接),所以我很樂意提供幫助。您是否可以通過單個相應的代碼示例將問題簡化爲單個JSON,以重現問題? –

+0

@FrankvanPuffelen對不起,跳過鏈接,我試圖從昨天開始解決這個問題,現在有點累了。我已經應用了您建議的版本。請讓我知道是否還有其他事情可以改善我的問題。 – cutiko

+0

爲什麼你不使用'startAt(String value,String key)'?你認爲「雙重」價值是什麼意思? –

回答

0

您似乎認爲將兩個參數傳遞給endAt()會使查詢以無論哪個值或關鍵位於何處結束。這不是查詢在Firebase中的工作方式。

endAt()的第二個參數僅在查詢找到與第一個參數匹配的節點後纔會使用。

所以當你通過endAt(500, "200xyz")時,數據庫首先在value2等於value2(第一個參數)的節點上過濾。這意味着它發現該節點作爲查詢的末尾:

"500xyz":{ 
    "value1": 500, 
    "value2": 500, 
    "name":"500xyz" 
} 

然後,它使用鍵200xyz(第二個參數),以確定是否包括該節點或不(技術上:其中在多個節點的列表結束返回)。由於密鑰200xyz500xyz前的查詢結果不包括這個節點上,從而導致:

"100xyz":{ 
    "value1": 100, 
    "value2": 100, 
    "name":"100xyz" 
}, 
"200xyz":{ 
    "value1": 200, 
    "value2": 200, 
    "name":"200xyz" 
}, 
"300xyz":{ 
    "value1": 300, 
    "value2": 300, 
    "name":"300xyz" 
}, 
"400xyz":{ 
    "value1": 400, 
    "value2": 400, 
    "name":"400xyz" 
}, 

另見:

相關問題