java - 使用 Query 读取 Firebase 数据库返回 null
问题描述
在这里,我尝试通过匹配我从事件节点获得的 userId 和 eventId 来获取喜欢的事件节点密钥。我做了一些代码,但查询在 likeEventKey 上返回 null。
这是我试图在 onDataChange 方法中包含循环和不循环的事件节点。结果是一样的。它给我null。
这里的节点是
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 的喜欢事件子键。
解决方案
下面的查询将只返回一个喜欢的事件节点(在此处查看)。因此里面的 for 循环onDataChange()
没有任何意义。它在一个喜欢的事件中循环遍历孩子
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();
}
}
}
}
});
您也可以与此类似地更改其他方法。
推荐阅读
- javascript - 如何从事件监听器中排除向下箭头键
- python - 我需要帮助弄清楚如何仅在标识符键匹配的情况下更改 pandas 数据框中的值
- javascript - TypeError "member_mentions.addroles" 不是函数
- msbuild - CopyFilesToOutputDirectory 日志相对路径
- python - 如何使用 discord.py 连接到我在 heroku 上的 PostgreSQL 数据库
- javascript - 在测试 javascript 时,我被重定向到 HugeDomains-dot-com
- java - 在 sbt 中运行带有安全管理器的分叉 JVM
- python - 仅在 Dataframe Pandas 中添加带有时间的新列
- javascript - 在 Sequelize 中的关联之间切换(同时一对多和多对多)
- ios - 不能只用 tableViewController 获得大标题