if语句在从firebase检索数据时没有返回正确的元素

时间:2017-10-16 01:25:19

标签: android firebase if-statement firebase-realtime-database

我在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}}除了uniqueId3uniqueId7之外,因为child2中也存在这两个{1}},而是uniqueId除了uniqueId3之外的所有uniqueId7uniqueId3两次,uniqueId7lID.trim().equals(blackListedId.trim()一次。

需要注意的另一点是,当我将该条件设为uniqueId3时,我只会获得符合此要求的2个ID,即uniqueId7和{{ 1}}如果child2uniqueId11下只有1个ID,那么除了这里的uniqueId之外我还有!lID.trim().equals(blackListedId.trim()个但是有2个或更多ID导致问题

我希望你能解决我的问题。我尽力用尽可能少的代码来解释它。

为什么{{1}}会返回意外的ID,我怎样才能获得满足此条件的ID?

1 个答案:

答案 0 :(得分:0)

子2的addListenerForSingleValueEvent将始终被调用两次 - 一次设置时,第二次读取所有数据时。因此,当它第一次被调用时,它最终会调用fMethod(fID, ""),这是你从Child 1获得所有ID的地方,包括3和7.但是下次当它调用它时,它就像你描述它一样正常。因此,如果您从子项"else"中删除ValueEventListener条件,我认为它应该可以正常工作。

如果我理解你的问题并回答它,请告诉我。如果没有,请随时解释更多细节。