Android的火力地堡-的getValue?

时间:2017-11-04 12:19:09

标签: android firebase firebase-realtime-database

我正在尝试构建一个可以更新拥有该应用的所有人的任务应用, 我想要一些按钮,每个按钮是另一个任务,现在我有2个, 我希望每当有人按下任务时,任务都有"点"为了给点击它的某个用户,按钮将更新为每个人DONE,按钮的名称将更改为ButtonName + UserClicked + TimeClicked。 我无法从JSON文件获取点值并使用点更新用户,这是我的JSON文件:

{
    "Tasks":{
        "Room1":{
            "DoTime":"",
            "ID":2,
            "MadeBy":"",
            "Points":150,
            "isActive":1
        },
        "Room2":{
            "DoTime":"",
            "ID":1,
            "MadeBy":"",
            "Points":100,
            "isActive":1
        }
    },
    "Users":{
        "L18uheV3GVbmJ8GmVvoCOmU3e1E2":{
            "Email":"a@a.com",
            "Points":0,
            "UserName":"Name1",
            "isAdmin":0
        },
        "tcAOO7dmXEgADBqRwTTlUfWIH803":{
            "Email":"b@a.com",
            "Points":0,
            "UserName":"Name2",
            "isAdmin":0
        }
    },
"update":2
}

这是我的代码:

String displayName = " ";
Object TaskingPoints = 0;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference RefUser =     database.getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
    DatabaseReference RefTask = database.getReference("Tasks");
    public void button_function(View Button){
    final String ButtonTaskName =         Button.getResources().getResourceEntryName(Button.getId());
    final Button b = (Button) Button;
    DatabaseReference givePoints = database.getReference(ButtonTaskName).child("Points");
    DatabaseReference ClickUser = (DatabaseReference) RefUser.child("UserName");
    final CharSequence ClickTime = DateFormat.format("dd-MM-yyy (HH:mm)" , new Date().getTime());

RefUser.child("UserName").addValueEventListener(new ValueEventListener(){
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        displayName = dataSnapshot.getValue().toString();
        b.setText(b.getText() + " (" + displayName + ") " + ClickTime);
        RefTask.child(ButtonTaskName).child("DoTime").setValue(ClickTime);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
RefTask.child(ButtonTaskName).child("Points").addValueEventListener(new ValueEventListener(){
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        TaskingPoints = dataSnapshot.getValue();

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
RefTask.child(ButtonTaskName).child("isActive").setValue(0);
RefUser.child("Points").setValue(TaskingPoints);
RefTask.child(ButtonTaskName).child("MadeBy").setValue(displayName);


b.getBackground();
b.setEnabled(false);
b.setBackgroundResource(R.color.myGreen); 
}

很多工作,但问题是: 每当我运行应用程序和我点击的第一个按钮时,用户的点数不会更新,任务中的MadeBy键也不会更新,但是当我点击另一个按钮时,所有内容都会更新,但是通过我点击的第一个按钮, 请教我,我做错了什么。 P.S:点击时按钮调用此功能。

1 个答案:

答案 0 :(得分:1)

花了一段时间来理解你的代码,你应该更多地解释它。无论如何,你的代码中的问题是你在单击按钮时附加了监听器,这就是为什么在下一个按钮上点击一切正常。

要解决此问题,您应该在button_function外添加这些:

RefUser.child("UserName").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    displayName = dataSnapshot.getValue().toString();
    b.setText(b.getText() + " (" + displayName + ") " + ClickTime);
    RefTask.child(ButtonTaskName).child("DoTime").setValue(ClickTime);
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

 RefTask.child(ButtonTaskName).child("Points").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    TaskingPoints = dataSnapshot.getValue();

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

我建议你在onCreate方法中添加它们。