嗨,我目前正在開發一個由Firebase支持的Android項目。
我建立了一個非規格化數據結構,通過votes
的方式將polls
與users
(多對多關係)關聯起來。這裏是一個圖像,顯示我的數據庫的路徑votes
。的結構如下:
票 - > [pollUid] - > [votePushuid] - >投票對象
因此,在這個例子中,我們有具有4票單個輪詢。
我想運行檢查以查看用戶是否已投票進行投票。爲了做到這一點,我獲取pollsUid,然後運行其投票,看看它們中的任何一個是否包含voterUid屬性==到其用戶uid。
FirebaseHandler.getInstance().getMainDatabaseRef()
.child(FirebaseConstants.VOTES) //votes root
.child(pollKey) //polluid
.orderByChild("voterUid")
.equalTo(FirebaseHandler.getInstance().getUserUid())
.limitToFirst(1)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(!dataSnapshot.exists()) {
如果再datasnaptshot存在,我們知道用戶已經投過票了,可以在Java邏輯處理:
這是如下完成。
問題:
通過onDataChange
收到的datasnapshot總是空(即不存在)特定用戶對特定的民意調查投票搜索時。我知道一個事實,即投票通過檢查數據存在於db中,並且通過調試userUid是正確的。刪除equalTo
和limitToFirst
返回投票的所有投票沒有問題,所以ref的詞幹是正確的。這意味着這個問題是由剛剛提到的兩種方法之一創建的。更奇怪的是,這種方法在某些時候確實有效,但在其他情況下卻不起作用。
問題: 如何返回由grandchild屬性過濾的firebase存儲對象列表?如果這是不可能的,那麼這個問題會是更合適的數據結構呢?
在進一步的說明中,我已經看到人們採用使用查詢而不是DatabaseReferences的方法。也許這可能與當前的問題有關。