2017-03-26 68 views
0

我創建使用火力地堡數據庫的審查的程序,火力地堡深查詢OrderByChild equalTo的Android

每個用戶,都有檔案(顯示名,形象,年齡和性別),我允許用戶更改個人資料名稱和圖像,,當用戶更改其名稱的所有帖子的評論保持舊的名稱(offcurse,我並沒有改變它們),因此,我創建了運行每次用戶更改其名稱的方法 -

mFirebaseDatabaseReference.child("displayName").setValue(newName); 
    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    final DatabaseReference dataRef = database.getReference(); 
    dataRef.child("reviews").orderByChild("uid").equalTo(mFirebaseUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() { 
               @Override 
               public void onDataChange(final DataSnapshot snapshot) { 
                for (DataSnapshot data : snapshot.getChildren()) { 
                 data.child("userName").getRef().setValue(newName); 
                } 
               } 
      }); 

這是一種魅力,但我的問題是評論評論,

如何將它們排序爲與我的UID相同?

我想,我需要這樣的東西「深訂貨」

項目結構 -

Project structure

回答

0

火力地堡數據庫查詢只能排序上的屬性深度只有一層或在一個固定的路徑。所以你需要增加你的數據模型來允許這個用例。

最簡單的方法是保持從UID到他們評論的映射,這對向用戶顯示他們的評論可能也是有用的。它應該是這樣的:

"userComments": { 
    "uidOfNirel": { 
    "-KfpD...._-Kfpu...": "-KfpD..../-Kfpu..." 
    } 
} 

所以價值的實際路徑特定的評論,讓您能夠快速重構完整參考每個評論。密鑰只是路徑的編碼版本,以確保唯一性,而不會生成另一個推送ID。然後你會得到用戶的所有評論和循環他們:

dataRef.child("userComments").child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() { 
public void onDataChange(DataSnapshot snapshot) { 
    for (DataSnapshot commentSnapshot: snapshot.getChildren()) { 
    System.out.println(commentSnapshot.getKey()); 
    DatabaseReference commentRef = dataRef.child("reviews-comments").child(commentSnapshot.getValue(String.class)); 
    commentRef.addListenerForSingleValueEvent(... 
    } 
}); 
+0

嗯,不喜歡它,但我想現在沒有任何其他的方式.. – Nirel