2016-08-08 54 views
1

上下文:孫女財產在過濾器[在Android]

嗨,我目前正在開發一個由Firebase支持的Android項目。

我建立了一個非規格化數據結構,通過votes的方式將pollsusers(多對多關係)關聯起來。這裏是一個圖像,顯示我的數據庫的路徑votes。的結構如下:

票 - > [pollUid] - > [votePushuid] - >投票對象

enter image description here

因此,在這個例子中,我們有具有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是正確的。刪除equalTolimitToFirst返回投票的所有投票沒有問題,所以ref的詞幹是正確的。這意味着這個問題是由剛剛提到的兩種方法之一創建的。更奇怪的是,這種方法在某些時候確實有效,但在其他情況下卻不起作用。

問題: 如何返回由grandchild屬性過濾的firebase存儲對象列表?如果這是不可能的,那麼這個問題會是更合適的數據結構呢?

在進一步的說明中,我已經看到人們採用使用查詢而不是DatabaseReferences的方法。也許這可能與當前的問題有關。

回答

1

您的查詢是正確的。我沒有問題使用我自己的數據庫運行該查詢。這可能是userId不匹配。 DatabaseReference延伸Query,這就是爲什麼你可以訪問查詢的方法。

數據庫結構替代辦法是

{ "users_votes": { 
     "<userId>": { 
      "<pollId1>" : true, 
      "<pollId2>" : true, 
      "<pollId3>" : true 
     } 
    } 
} 

將值設置到該節點一旦用戶投票於輪詢。

要檢查用戶是否投票支持一項民意調查

usersVotesRef.child(FirebaseHandler.getInstance().getUserUid()) 
    .child(pollKey).addListenerForSingleValueEvent(valueEventListener);