我要替换kids / [id] / kidLimit / [新数据]
所以我要做的是用kidName数据制作一个微调器,然后使用该微调器中的所选项目替换kidLimit的数据(父级与该微调器中的所选项目相同)。
我要做的第一件事是找到所选项目的唯一键,然后使用该唯一键转到kidLimit,然后使用setValue()方法。
public class setLimit extends AppCompatActivity {
private DatabaseReference db;
private EditText etLimit;
private Button btnSetLimit;
private Spinner kidSpinner;
private String kidKey;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_set_limit);
etLimit = findViewById(R.id.et_limit);
btnSetLimit = findViewById(R.id.btn_confirm);
kidSpinner = findViewById(R.id.spinner_kid);
//PUTTING STRING LIST FROM FIREBASE TO SPINNER DROPDOWN STARTS HERE
db = FirebaseDatabase.getInstance().getReference().child("kids");
db.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
final List<String> kid = new ArrayList<>();
for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren()) {
String kidName = dataSnapshot1.child("kidName").getValue(String.class);
kid.add(kidName);
}
ArrayAdapter<String> kidNameAdapter = new ArrayAdapter<>(setLimit.this, android.R.layout.simple_spinner_item, kid);
kidNameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
kidSpinner.setAdapter(kidNameAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
//ENDS HERE
//ONCLICKLISTENER
btnSetLimit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findId();
String newLimit = etLimit.getText().toString().trim();
db.child(kidKey).child("kidLimit").setValue(newLimit);
}
});
}
//FINDING KEY FROM THE SELECTED SPINNER ITEM
public void findId(){
String kidName = kidSpinner.getSelectedItem().toString();
db = FirebaseDatabase.getInstance().getReference().child("kids");
db.orderByChild("kidName").equalTo(kidName).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
kidKey = dataSnapshot1.getKey();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
所以基本上我所做的就是使用onclick方法中的快照来查找密钥。但是,当我在日志上检查它们时,它表明Kidkey变量在我第一次按下该按钮时为null,但此后不再为null。
当我按下按钮时,我该怎么办,我可以转到一个特定的子项来替换它的数据而没有任何空指针异常?
答案 0 :(得分:1)
执行此操作
btnSetLimit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findId();
String newLimit = etLimit.getText().toString().trim();
db.child(kidKey).child("kidLimit").setValue(newLimit);
}
});
findId();
已执行,但您不知道何时完成,因此在执行该方法并等待数据之后,此行
db.child(kidKey).child("kidLimit").setValue(newLimit);
将使kidKey的值为空,因为尚未将其从数据库中拉出,因此,您应该将代码移至onDataChange()
或在所有异步过程完成后进行新的回调
btnSetLimit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findId();
}
});
public void findId(){
String kidName = kidSpinner.getSelectedItem().toString();
String newLimit = etLimit.getText().toString().trim();
db = FirebaseDatabase.getInstance().getReference().child("kids");
db.orderByChild("kidName").equalTo(kidName).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
kidKey = dataSnapshot1.getKey();
}
db.child(kidKey).child("kidLimit").setValue(newLimit);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});