2017-08-11 24 views
0

我有數據庫這樣的:的Android /火力地堡計算數字行的總和相同的孩子

"Users" : { 
    "user_ykdF5b234afdgd" : { 
     "Scoring" : [ { 
      "Name" : "Name1", 
      "punkte" : "0" 
     }, { 
      "Name" : "Name2", 
      "punkte" : "0" 
     } ], 
     "image" : "", 
     "membertype" : "bike", 
     "startnummer" : "1", 
     "teamname" : "Paul Musterman" 
     } 
    }, 
    "user_ykdF5b234afdgd2" : { 
     "Scoring" : [ { 
      "Name" : "Name1", 
      "punkte" : "0" 
     }, { 
      "Name" : "Name2", 
      "punkte" : "0" 
     } ], 
     "image" : "", 
     "membertype" : "bike", 
     "startnummer" : "1", 
     "teamname" : "Franz Musterman" 
     } 
    }, 

user_ykdF5b234afdgd是我的表:

用戶:{ user_ykdF5b234afdgd:{ ....

我想在每個UserChild中的Scoring孩子中顯示和總結「punkte」。

"Scoring" : [ { 
     "Name" : "Name1", 
     "punkte" : "100" 
     }, { 
     "Name" : "Name2", 
     "punkte" : "150" 
     } ], 

我想添加100 + 150,並在我的Android佈局中顯示250。

 mDatabase.child("Users").child("user_ykdF5b234afdgd/Scoringboard").orderByChild("Name").addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.exists()) { 
        for (DataSnapshot snapshot : 
          dataSnapshot.getChildren()) { 
         try { 
          Log.d("debuug", String.valueOf(snapshot.child("Name").getValue()) + " "+ String.valueOf(snapshot.child("punkte").getValue())); 

         } catch (NumberFormatException e) { 
          Log.d("debuug", "Eingabe nicht valide"); 
         } 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }); 

我測試了這一點,並得到了分數,但是這兩個「失敗」

1)我怎麼能使用這個與我的所有子項?

mDatabase.child("Users").child("user_ykdF5b234afdgd/Scoringboard").orderByChild("Name").addValueEventListener(new ValueEventListener() { 

只能在這些孩子.... TEILNEHMERDATA包含我的所有用戶

2)我怎樣才能總結成績?

謝謝=)

如果有什麼不清楚,我會解釋!

回答

0

首先,我建議你將punkte的值加上Integers而不是字符串。然後,我建議你稍微改變你的數據庫結構。你的數據庫結構應該是這樣的:

Scoring 
    | 
    --- scoreId 
    |  | 
    |  --- Name: "Name1" 
    |  | 
    |  --- punkte: 100 
    | 
    --- scoreId 
     | 
     --- Name: "Name2" 
     | 
     --- punkte: 150 

要做到這一點,我建議你使用push()方法創造得分的ID。假設Users是你的火力地堡根的直接子,總結這些值,請使用如下代碼:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference usersRef = rootRef.child("Users"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     int totalPunkte = 0; 
     for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) { 
      for(DataSnapshot ds: dSnapshot.child("Scoring").getChildren()) { 
       int punkte = ds.child("punkte").getValue(Integer.class); 
       totalPunkte = totalPunkte + punkte; 
      } 
     } 
     Log.d("TAG", totalPunkte); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
usersRef.addListenerForSingleValueEvent(eventListener); 
+0

感謝您的答覆。 改變了一點,它的工作原理:(看我自己的答案) – georf

0

感謝您的答覆。

改了一點,它的工作原理:

@Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
      int sum = 0; 
      for (DataSnapshot snapScore : snapshot.child("Scoringboard").getChildren()) { 
       sum += Integer.parseInt(String.valueOf(snapScore.child("punkte").getValue())); 
      } 
      try { 
       this.u = new User(snapshot.getKey(), ((String) snapshot.child("teamname").getValue()), sum); 
       teilnehmerList.add(this.u); 
      } catch (NumberFormatException e) { 
       Log.d("debug", "Punkte nicht valide"); 
      } 
     } 
    } 

的解決方案是:

int sum = 0; 
for (DataSnapshot snapScore : snapshot.child("Scoringboard").getChildren()) { 
    sum += Integer.parseInt(String.valueOf(snapScore.child("punkte").getValue())); 
}