Если оператор не возвращает правильные элементы при извлечении данных из firebase

У меня есть некоторые данные в FirebaseDatabase, которые выглядят следующим образом:

app
 -child1
   -uniqueId1
     -pId1
     -lId1
   -uniqueId2
     -pId2
     -lId2
   -uniqueId3
     -pId3
     -lId3
   -uniqueId4
     -pId4
     -lId4
   -uniqueId5
     -pId5
     -lId5
   -uniqueId6
     -pId6
     -lId6
 -child2
   -uniqueIdA1
     -uniqueId7
     -uniqueId8
     -uniqueId9
     -uniqueId10
     -uniqueId11
     -uniqueId1
     -uniqueId2
     -uniqueId3
     -uniqueId4
     -uniqueId5

Я извлекаю данные child1 следующим образом:

public void fMethod(final String fID, final String blackListedId) {
        mDatabase.child("child1").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot.getValue() != null) {
                    Profile profile = dataSnapshot.getValue(Profile.class);
                    String pID = profile.getPID();
                    String lID = profile.getLID();
                    if (!pID.trim().equals(AccessToken.getCurrentAccessToken().getUserId().trim())) {
                        if (pID.trim().equals(fID.trim())) {
                            if (!lID.trim().equals(blackListedId.trim())) {
                            // populate the view with elements which meet this condition/requirement

                            String listingID = profile.getlID();
                            Log.d("LISTING_IDS", listingID);

                            } else {
                                Log.d("dataSnapshot", "null1");
                            }
                        } else {
                            Log.d("dataSnapshot", "null2");
                        }
                    } else {
                        Log.d("dataSnapshot", "null3");
                    }
                } else {
                    Log.d("dataSnapshot", "null4");
                }
            }
            ...
            ...
            ...
    }

и child2 такие данные:

public void fData(final String fID) {

        mDatabase.child("child2").child(AccessToken.getCurrentAccessToken().getUserId()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.getValue() != null) {
                    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                        String blackListedId = childSnapshot.getValue().toString();
                        fMethod(fID, blackListedId);
                    }
                } else {
                    fMethod(fID, "");
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

а затем в другом коде я извлекаю fID и вызывается метод fData().

Я зарегистрировал все идентификаторы, которые я получаю из базы данных:

D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId1
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId2
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId3
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId4
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5
D/LISTING_IDS: uniqueId5

Здесь Profile.java код файла: https://gist.github.com/HammadNasir/a196bcdc6dccbf69657fca528443e680

Проблема заключается в том, что в выражении fMethod() if условие !lID.trim().equals(blackListedId.trim(), поэтому, как вы можете видеть в базе данных, я должен получить все uniqueId под child1 кроме uniqueId3 и uniqueId7, потому что эти 2 также присутствуют в child2, но вместо этого я получаю все uniqueId, кроме uniqueId3 и uniqueId7 дважды, и uniqueId3 и uniqueId7 один раз.

Еще одно замечание: когда я делаю это условие как lID.trim().equals(blackListedId.trim(), я получаю только 2 идентификатора, которые соответствуют этому требованию, т.е. uniqueId3 и uniqueId7, и если child2 имеет только 1 id под uniqueId11, тогда я получаю все uniqueId, кроме одного здесь, но с 2 или более идентификаторами вызывает проблему.

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

Почему !lID.trim().equals(blackListedId.trim() возвращает неожиданные идентификаторы и как я могу получить только идентификаторы, удовлетворяющие этому условию?

Ответ 1

addListenerForSingleValueEvent для дочернего 2 всегда будет вызываться дважды - один раз, когда вы его настроите и второй, когда он прочитает все данные. Поэтому, когда он вызывается в первый раз, он вызывает вызов fMethod(fID, ""), в котором вы получаете все идентификаторы от Child 1, включая 3 и 7. Но в следующий раз, когда он его вызывает, все отлично, когда вы его описываете. Поэтому, если вы удалите условие "else" из вашего child2 ValueEventListener, я думаю, что он должен работать нормально.

Сообщите мне, понял ли я ваш вопрос и ответил на него. Если нет, не стесняйтесь объяснять более подробную информацию.