2017-10-16 63 views
5

mam pewne dane FirebaseDatabase który wygląda następująco:if nie zwraca poprawnych elementów na pobieranie danych z Firebase

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 

mam pobierania child1 „s dane tak:

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"); 
       } 
      } 
      ... 
      ... 
      ... 
    } 

i child2 „S dane, jak to:

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

      } 
     }); 
    } 

a następnie w innym kodzie pobieram metodę fID i wywołuję tam metodę.

Zalogowałem wszystkie identyfikatory Dostaję z bazy danych:

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 

Oto kod Profile.java plik za: https://gist.github.com/HammadNasir/a196bcdc6dccbf69657fca528443e680

Problem polega na tym, że w fMethod() „s if warunek jest !lID.trim().equals(blackListedId.trim() tak, jak widać w bazie danych, powinienem dostać wszystkie uniqueId s pod child1 z wyjątkiem uniqueId3 i uniqueId7, ponieważ te 2 są obecne również w child2, ale zamiast tego otrzymuję wszystkie uniqueId s z wyjątkiem uniqueId3 i uniqueId7 dwa razy i uniqueId3 i uniqueId7 raz.

Inną rzeczą, aby pamiętać, że kiedy robię tego warunku jako lID.trim().equals(blackListedId.trim(), Dostaję tylko 2 identyfikatory, które odpowiadają tym wymaganiom, tj uniqueId3 i uniqueId7 i jeśli child2 ma tylko 1 id pod uniqueId11 następnie I m uzyskanie wszystkich uniqueId s, z wyjątkiem tego, ale przyczyną 2 lub więcej identyfikatorów jest przyczyną problemu.

Mam nadzieję, że masz mój problem. Starałem się jak najlepiej wytłumaczyć to najmniejszym możliwym kodem.

Dlaczego !lID.trim().equals(blackListedId.trim() zwraca nieoczekiwane identyfikatory i jak uzyskać tylko te identyfikatory, które spełniają ten warunek?

+0

@Ibrahim nie znasz podstawy Firebase? –

+1

Cóż, myślę, że twoja sprawa nie zależy od umiejętności firebooka, zależy bardziej od umiejętności debugowania, spróbuj debugować wartości i sprawdź warunki, na pewno jest to najszybsze rozwiązanie. – Ibrahim

+1

Zapisuj wszystko, co pobieramy z serwera. Następnie opublikuj swój logcat za pomocą kodu. –

Odpowiedz

0

Element addListenerForSingleValueEvent dla elementu podrzędnego 2 będzie zawsze wywoływany dwukrotnie - raz podczas konfigurowania i drugi po odczytaniu wszystkich danych. Więc kiedy jest wywoływana po raz pierwszy, kończy się wywoływaniem fMethod(fID, ""), gdzie otrzymujesz wszystkie identyfikatory od Dziecka 1, w tym od 3 do 7. Ale następnym razem, gdy to wywołuje, robi się dobrze, jak to opisujesz. Więc jeśli usuniesz warunek "else" ze swojego dziecka2ValueEventListener, myślę, że powinien działać dobrze.

Daj mi znać, jeśli rozumiem Twoje pytanie i odpowiem na nie. Jeśli nie, możesz wyjaśnić więcej szczegółów.

+0

Nie, Abhishek. Tak się nie dzieje. Dodałem instrukcję 'log' w kodzie" else ", która nie została wywołana. –