Попытка заменить данные от определенного дочернего элемента (База данных Firebase) - PullRequest
0 голосов
/ 31 января 2019

Я хочу заменить 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 равна нулю при первом нажатии кнопки, но после этого она больше не равна нулю.

Что я могу сделать, когда я нажимаю кнопку, я могу перейти к определенному дочернему элементу, чтобы заменить его данные, не получая никакого исключения нулевого указателя?

Вот база данных, которую я использую Database Used

1 Ответ

0 голосов
/ 31 января 2019

Когда вы делаете это,

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 со значением NULL, поскольку он еще не был извлечен из базы данных, поэтому вместо этого вы должны переместить свой код в 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) {

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...