更新firebase数据库/传递值中的数据

时间:2017-11-21 11:20:31

标签: java android firebase firebase-realtime-database

点击“保存”按钮后,我的目标是递减值“数量”。当我从onClick调用函数updateTraining时会发生错误,因为传递参数为null。所以我的问题是如何正确地将值从数据库传递到updateTraining并减少数量值。

在我的代码下面:

public class Activity12 extends AppCompatActivity implements View.OnClickListener{

ListView listViewTraining;
int quantity;
String id;
List<AddTraining> trainingList;
Button buttonUpdate;


DatabaseReference datababaseTraining;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_12);



    datababaseTraining = FirebaseDatabase.getInstance().getReference("Event");

    listViewTraining = (ListView) findViewById(R.id.listViewTraining);
    trainingList = new ArrayList<>();

    listViewTraining.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            AddTraining addTraining = trainingList.get(i);


            showUpdateDialog(addTraining.getPlace(), addTraining.getDate(), addTraining.getTime(), addTraining.getQuantity(), addTraining.getId());

            return false;
        }
    });

}


@Override
protected void onStart() {
    super.onStart();

    datababaseTraining.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            trainingList.clear();

            for(DataSnapshot trainingSnapshot : dataSnapshot.getChildren()){


                //First checkout
                AddTraining addtraining = trainingSnapshot.getValue(AddTraining.class);
                System.out.println("check " + addtraining.getPlace());
                System.out.println("check " + addtraining.getTime());
                System.out.println("check " + addtraining.getDate());
                System.out.println("check " + addtraining.getQuantity());
                System.out.println("check " + addtraining.getId());
                trainingList.add(addtraining);



            }

            TrainingList adapter = new TrainingList(Activity12.this, trainingList);
            listViewTraining.setAdapter(adapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

private void showUpdateDialog(String place, String date, int time, int quantity, String id){
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);

    LayoutInflater inflater = getLayoutInflater();

    System.out.println("checkpoint2 " + quantity);

    final View dialogView = inflater.inflate(R.layout.update_dialog, null);

    dialogBuilder.setView(dialogView);

    final TextView textViewPlace = (TextView) dialogView.findViewById(R.id.textViewPlace2); 
    final TextView textViewDate = (TextView) dialogView.findViewById(R.id.textViewDate2);   
    final TextView textViewTime = (TextView) dialogView.findViewById(R.id.textViewTime2);   
    final TextView textViewQuantity = (TextView) dialogView.findViewById(R.id.textViewQuantity2);
    buttonUpdate = (Button) dialogView.findViewById(R.id.buttonUpdate);
    buttonUpdate.setOnClickListener(this);
    dialogBuilder.setTitle("More details:");

    final AlertDialog alertDialog = dialogBuilder.create();
    alertDialog.show();

    textViewPlace.setText(place);
    textViewDate.setText("Date: " + date);
    textViewTime.setText("Hour: " + String.valueOf(time));
    textViewQuantity.setText("Quantity: " + String.valueOf(quantity));

}

@Override
public void onClick(View view) {
    if (view == buttonUpdate) {
        updateTraining(quantity, id);

    }
}

private void updateTraining( int quantity, String id){
    System.out.println("checkout3 " + quantity);
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Event");
    databaseReference.child(id).child("quantity").setValue(quantity-1);

    Toast.makeText(this, "Saved", Toast.LENGTH_LONG).show();


}

}

我的db结构是:

enter image description here

2 个答案:

答案 0 :(得分:0)

这样做:

Activity声明下添加:

int quantity=0;

//onCreate内:

datababaseTraining = FirebaseDatabase.getInstance().getReference().child("Event");


datababaseTraining.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot data : dataSnapshot.getChildren()){
         id=data.getKey();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

现在字符串id等于Event

中的键

现在在updateTraining(quantity, id);内,您应该quantity=0id=key_of_node

答案 1 :(得分:0)

您的引用对象为空,因此您的数据库未更新

textViewTime.setText("Hour: " + String.valueOf(time));
textViewQuantity.setText("Quantity: " + String.valueOf(quantity));
在此行下方

添加此

this.quantity = quantity;
this.id=id;