Проверка базы данных Firebase, имеет ли она нулевое значение, не работает с DataSnapshot - PullRequest
1 голос
/ 09 апреля 2020

поэтому у меня есть база данных, где я ищу товары по штрих-кодам. enter image description here

Я хотел проверить, есть ли товары в моей базе данных

mFirebaseInstance = FirebaseDatabase.getInstance();
mFirebaseDatabase = mFirebaseInstance.getReference("ProductData");
productId = mFirebaseDatabase.push().getKey();

public void searchProduct(String barcode){

    Query barcodeQuery = mFirebaseDatabase.child("Products")
            .orderByChild("barcode").equalTo(barcode);

    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {

                    String name = ds.child("name").getValue(String.class);
                    int price = ds.child("price").getValue(Integer.class);
                    int quantity = ds.child("quantity").getValue(Integer.class);
                    Log.d("DATABASE", name + "/" + price + "/" + quantity);  /// The output that I get is this: Neopraxam/25/1    and  Vazelina/250/1

Так я ищу товары по штрих-коду.

searchProduct("123123123");

searchProduct("3232");

Я пытался добавить эти методы, чтобы проверить, является ли значение, которое я пытаюсь получить, нулевым:

if (ds.exists()){}  OR
if (ds.getChildrenCount() != 0){}

Но я видел, что оно даже не вводится в l oop, если значение не существует. Итак, я предполагаю, что это исходит из запроса. Итак, как я могу проверить, возвращает ли запрос нулевое значение, потому что я использовал метод .equalTo (штрих-код), поэтому я предполагаю, что он должен возвращать истинное или ложное значение

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Нет способа, которым метод DataSnapshot getChildren () может вернуть null:

Возвращает

  • True, если моментальный снимок содержит ненулевое значение, в противном случае false

Для решения проблемы следует использовать метод DataSnapshot exist () :

Возвращает

  • True, если снимок содержит ненулевое значение, в противном случае false

Так что каждый во время выполнения запроса проверяйте каждый элемент на наличие, используя вышеуказанный метод exists().

Кроме того, ваш метод searchProduct() никогда не сможет вернуть значение из базы данных. Для получения дополнительной информации, пожалуйста, смотрите мой ответ из следующего поста:

1 голос
/ 09 апреля 2020

Проблема, кажется, с onDataChange подписью, поскольку она содержит NonNull аннотацию. Чтобы выполнить onDataChange тело даже для DataSnapshot нулевого значения, обновите подпись следующим образом

   ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
        .
        .
        .

        }

Примечание: Вы должны использовать SingleValueEventListener вместо ValueEventListener

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