Извлекать и обновлять дочерние данные в firebase - PullRequest
0 голосов
/ 02 октября 2019

У меня проблема с получением и обновлением значения из базы данных Firebase реального времени:

reff = FirebaseDatabase.getInstance().getReference("Items").child(a);
        reff.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snap : dataSnapshot.getChildren()) {
                    Items items = dataSnapshot.getValue(Items.class);
                    Integer na = items.getItemQuantity();

                    if (na <= 0) {
                        Toast.makeText(CheckOut.this, "Out of Stock", Toast.LENGTH_LONG).show();
                    } else {
                        na--;
                        snap.child("itemQuantity").getRef().setValue(na);
                    }
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Журнал ошибок в строке 60 из if-else.

1 Ответ

0 голосов
/ 02 октября 2019

Согласно вашему последнему комментарию:

yes a - это штрих-код, который я получу от штрих-кода. itemQuantity одиночного потомка.

Чтобы получить значение itemQuantity свойства одиночного потомка, используйте следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference barcodeRef = rootRef.child("Items").child("1234567781");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long itemQuantity = dataSnapshot.child("itemQuantity").getValue(Long.class);
        Log.d(TAG, String.valueOf(itemQuantity));

        //Do what you need to do with itemQuantity
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
barcodeRef.addListenerForSingleValueEvent(valueEventListener);

Результат вlogcat будет выглядеть следующим образом:

14

Проблема в вашем коде заключается в том, что вы перебираете объект dataSnapshot, используя метод getChildren(), когда это на самом деле не нужно. Вы должны получить только правильную ссылку, как в приведенном выше коде, и просто использовать значение свойства itemQuantity при необходимости.

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