尝试替换特定子项中的数据(Firebase数据库)

时间:2019-01-31 17:19:44

标签: android firebase firebase-realtime-database

我要替换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。

当我按下按钮时,我该怎么办,我可以转到一个特定的子项来替换它的数据而没有任何空指针异常?

这是我使用的数据库 Database Used

1 个答案:

答案 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) {

        }
    });