Если оператор не возвращает правильные элементы при извлечении данных из 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
, я думаю, что он должен работать нормально.
Сообщите мне, понял ли я ваш вопрос и ответил на него. Если нет, не стесняйтесь объяснять более подробную информацию.