if 语句在从 Firebase 检索数据时未返回正确的元素

if statement not returning the correct elements on retrieving data from firebase

提问人:Hammad Nasir 提问时间:10/16/2017 最后编辑:Hammad Nasir 更新时间:10/29/2017 访问量:412

问:

我有一些数据,看起来像这样: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) {

            }
        });
    }

然后在另一个代码中,我在那里检索 s 并调用方法。fIDfData()

我记录了我从数据库中获取的所有 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

文件代码如下: https://gist.github.com/HammadNasir/a196bcdc6dccbf69657fca528443e680Profile.java

问题是在 if 语句中,条件是这样的,正如您在数据库中看到的那样,我应该得到 except 和 下的所有 s,因为这两个也存在,但相反,我得到了所有的 s except 和 twice 和 and once。fMethod()!lID.trim().equals(blackListedId.trim()uniqueIdchild1uniqueId3uniqueId7child2uniqueIduniqueId3uniqueId7uniqueId3uniqueId7

另一件需要注意的事情是,当我将该条件设置为 时,我只得到符合此要求的 2 个 id,即,如果下面只有 1 个 id,那么我会得到除了这里的那个之外的所有 s,但有 2 个或更多 id 会导致问题。lID.trim().equals(blackListedId.trim()uniqueId3uniqueId7child2uniqueId11uniqueId

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

为什么返回意外的 id,如何只获取满足此条件的 id?!lID.trim().equals(blackListedId.trim()

android firebase firebase-realtime-database

评论

0赞 Hammad Nasir 10/18/2017
@Ibrahim您不熟悉 Firebase?
1赞 10/18/2017
好吧,我认为您的情况不取决于 firebase 技能,它更多地取决于调试技能,尝试调试值并检查您的条件,我相信这是最快的解决方案。
1赞 Ishaan Kumar 10/24/2017
记录您从服务器获取的所有内容。然后发布带有代码的 logcat。
1赞 Ishaan Kumar 10/25/2017
我无法在您的代码中看到任何日志命令
1赞 Ishaan Kumar 10/25/2017
记录所有 fID、黑名单 ID、AccessToken。然后比较它们。你会发现哪里出了问题。目前,您只是记录结果

答:

0赞 Abhishek 10/29/2017 #1

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

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

评论

0赞 Hammad Nasir 10/29/2017
不,阿比舍克。这并没有发生。我在代码中添加了一个语句,但它没有被调用。logelse