我在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()
方法。
我记录了我从数据库中获取的所有ID:
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
{1}}除了uniqueId3
和uniqueId7
之外,因为child2
中也存在这两个{1}},而是uniqueId
除了uniqueId3
之外的所有uniqueId7
和uniqueId3
两次,uniqueId7
和lID.trim().equals(blackListedId.trim()
一次。
需要注意的另一点是,当我将该条件设为uniqueId3
时,我只会获得符合此要求的2个ID,即uniqueId7
和{{ 1}}如果child2
在uniqueId11
下只有1个ID,那么除了这里的uniqueId
之外我还有!lID.trim().equals(blackListedId.trim()
个但是有2个或更多ID导致问题
我希望你能解决我的问题。我尽力用尽可能少的代码来解释它。
为什么{{1}}会返回意外的ID,我怎样才能获得满足此条件的ID?
答案 0 :(得分:0)
子2的addListenerForSingleValueEvent将始终被调用两次 - 一次设置时,第二次读取所有数据时。因此,当它第一次被调用时,它最终会调用fMethod(fID, "")
,这是你从Child 1获得所有ID的地方,包括3和7.但是下次当它调用它时,它就像你描述它一样正常。因此,如果您从子项"else"
中删除ValueEventListener
条件,我认为它应该可以正常工作。
如果我理解你的问题并回答它,请告诉我。如果没有,请随时解释更多细节。