【问题标题】:reading in Firebase Database with Query return null使用 Query 读取 Firebase 数据库返回 null
【发布时间】:2019-12-04 15:18:34
【问题描述】:

在这里,我尝试通过匹配我从事件节点获得的 userId 和 eventId 来获取喜欢的事件节点密钥。我做了一些代码,但查询在 likeEventKey 上返回 null。

这是我的事件节点 我试图在 onDataChange 方法中包含循环和不循环。结果是一样的。它给我null。

这里的节点是

the node

    private String likedEventKey;

 /*
     * Attach the data to the UI
     * */
    private void showEventData(Event event) {
        textView.setText(event.getEventKey() + ", " + currentUser.getUid() + "," + likedEventKey);
    }

/*
     * Method for checking like event status in Db based on EventKey
     * */
    private void checkLikeEventStatusInDb() {
        Query query = mLikedEventDbReference
                .child("liked-event")
                .orderByChild("eventId")
                .equalTo(event.getEventKey());
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    likedEvent = ds.getValue(LikedEvent.class);
                    if (likedEvent != null) {
                        String eventId = likedEvent.getEventId();
                        String eventKey = event.getEventKey();
                        if (eventId.equalsIgnoreCase(eventKey)) {
                            checkUsernameInLikeEventStatusInDb();
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Timber.e("Error while fetch letch liked event %s",
                        databaseError.getMessage());
            }
        });
    }

    /*
     * Method for checking like event status in Db based on UserId
     * */
    private void checkUsernameInLikeEventStatusInDb() {
        Query query = mLikedEventDbReference
                .child("liked-event")
                .orderByChild("userId")
                .equalTo(currentUser.getUid());
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    likedEvent = ds.getValue(LikedEvent.class);
                    if (likedEvent != null) {
                        likedEvent.setLikedEventKey(ds.getKey());
                        String userIdInLikedEvent = likedEvent.getUserId();
                        if (userIdInLikedEvent.equalsIgnoreCase(currentUser.getUid())) {
                            likedEventKey = likedEvent.getLikedEventKey();
                            Timber.d("likedEventKey: %s", likedEventKey);
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Timber.e("Error while fetch letch liked event %s",
                        databaseError.getMessage());
            }
        });
    }

我的预期回报是我得到了基于 userId 和 eventId 的喜欢事件子键。

【问题讨论】:

  • event.getEventKey()的值是多少?
  • 点赞事件节点的最新节点。所以 lkh8...na

标签: java android firebase firebase-realtime-database


【解决方案1】:

下面的查询只会返回一个 liked-event 节点(检查here)。因此onDataChange() 中的 for 循环没有任何意义。它在 liked-event

内循环遍历子项
Query query = mLikedEventDbReference
     .child("liked-event")
     .orderByChild("userId")
     .equalTo(currentUser.getUid());

通过如下所述更改代码,我想您将能够实现您所需要的。

    Query query = mLikedEventDbReference
            .child("liked-event")
            .orderByChild("eventId");

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                likedEvent = ds.getValue(LikedEvent.class);
                if (likedEvent != null) {
                    String eventId = likedEvent.getEventId();
                    String eventKey = ds.getKey();
                    if (eventId.equalsIgnoreCase(eventKey)) {
                        checkUsernameInLikeEventStatusInDb();
                    }
                }
            }
        }
    });

你也可以用类似的方法改变其他方法。

【讨论】:

  • 我分配 mLikedEventDbRefence 变量,例如 mLikedEventDbRefence = FirebaseStorage.getInstance().getReference("liked-event") 与 mLikedEventDbRefence = FirebaseStorage.getInstance().getReference() 有什么不同吗?
  • 是的。因此,您已经通过 get reference 引用了子节点“liked-event”。因此,您无需在查询中再次执行此操作。这样,您试图在“喜欢的事件”节点中引用“喜欢的事件”节点。只需在 getReference() 中删除对“liked-event”节点的引用会更优雅。
  • 我发现了我的问题。最好检查一种明确的方法。感谢您的评论兄弟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2019-03-26
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多