2017-11-21 9 views
0

「保存」ボタンをクリックした後、目標は「数量」減少します。渡す引数がnullなので、onClickから関数updateTrainingを呼び出すとエラーが発生します。だから私の質問は、データベースからupdateTraining値とデクリメント量の値を正しく渡す方法です。firebaseデータベース/通過値のデータを更新する

私のコードの下

:デシベルの

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(); 


} 

}

私の構造は次のとおりです。

enter image description here

+0

を追加し、あなたが何をしているかクリアしていない..しかし、彼らは最初place..Iには何も参照されないので、はい量とidは、両方ともNULLであるあなたが既に持っていると思いますIDはデータベースの権利ですか? –

+0

構造はどこですか? –

+0

間違えて申し訳ありませんが、私は投稿 "id"を編集しました。子ノードと同じ値です – drapek

答えて

0

は、次の操作を行います。

Activity下の宣言は、これを追加します//onCreate内部

int quantity=0; 

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は今、このupdateTraining(quantity, id);の内側にあなたがquantity=0id=key_of_node

0

あなたのrefrenceオブジェクトがnullである必要がありますEvent

内部キーに等しいですあなたのデータベースは更新されていません

この行の下に
textViewTime.setText("Hour: " + String.valueOf(time)); 
textViewQuantity.setText("Quantity: " + String.valueOf(quantity)); 

この

this.quantity = quantity; 
this.id=id; 
関連する問題