2016-05-21 84 views
0

所以我有我的後端使用firebase。我打算做的是將用戶匹配添加到用戶ID。但是,當用戶最初報名時,他們沒有匹配。我想要做的是檢查用戶孩子中是否存在「匹配」子元素,如果不是,則創建列表子元素並存儲第一個匹配元素。但是,如果它已經存在,則只需添加比賽。這裏是我的代碼:firebase檢查是否存在小孩

public void setMatch(final String match){ 
    final Firebase ref = new Firebase("FIREBASEURL"); 
    final Firebase userRef = ref.child("Flights").child(userName); 
    userRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      System.out.println("does the child exist? " + dataSnapshot.child("matches").exists()); 
      if(!dataSnapshot.child("matches").exists()){ 
       ArrayList<String> matches = new ArrayList<String>(); 
       matches.add(match); 
       Firebase matchesRef = userRef.child("matches"); 
       matchesRef.setValue(matches); 
       userRef.removeEventListener(this); 
      }else if(dataSnapshot.child("matches").exists()){ 
       Map<String, Object> matches = new HashMap<>(); 
       matches.put("matches", match); 
       userRef.child("matches").push().setValue(matches); 
       userRef.removeEventListener(this); 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

目前,正在添加值的兩倍(在else如果被調用兩次,如果該領域已經存在,/它稱爲如果它不)。我不確定我做錯了什麼。

回答

1

這聽起來相當過於複雜。在Firebase數據庫中,最好儘可能分開讀寫操作。雖然push id是以時間順序存儲數據的好方法,如果項目具有自然鍵,通常最好將它們存儲在該鍵下。

例如,如果您的String match確實是String matchId,則可以通過使用matchId作爲關鍵字確保每個匹配最多存在一次。

userRef.child("matches").child(matchId).setValue(true); 

此操作冪等:它會產生相同的結果,無論多久你運行它。

你會注意到,我不檢查的matches已經存在:在火力地堡數據庫自動生成所需要存儲的值的所有節點,它會自動刪除了下面有沒有值的所有節點。

1

它看起來像你創建的字段,如果它不存在於if塊中,然後測試以查看該字段(剛剛創建的)是否存在,現在它確實存在,因此它再次添加它。 removeEventListener調用將刪除偵聽器,但不會停止當前代碼的完成。

嘗試:

if(!dataSnapshot.child("matches").exists()){ 
      ArrayList<String> matches = new ArrayList<String>(); 
      matches.add(match); 
      Firebase matchesRef = userRef.child("matches"); 
      matchesRef.setValue(matches); 
      userRef.removeEventListener(this); 
      return; 
     }else if(dataSnapshot.child("matches").exists()){ 
      Map<String, Object> matches = new HashMap<>(); 
      matches.put("matches", match); 
      userRef.child("matches").push().setValue(matches); 
      userRef.removeEventListener(this); 
     } 

添加return語句應相當當前通話,並且還禁止監聽器,你打算。

相關問題