2017-08-11 68 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())); 
}