我需要从Firebase检索数据,如果user
在应用程序(即ImageView)中点击了“出席事件”图标,则应将其保存到他们的个人资料中。
我一直在阅读ValueEventListeners
,ChildEventListeners
,我认为最好的选择是使用ValueEventListener
,因为我需要datasnapshot
中的postid
用户已“保存”(参加)的广告。另外,已经阅读了有关查询的信息,这似乎可以为我提供帮助,我正在研究如何将其合并到我的数据中,但到目前为止还没有运气。
下面是指向我的JSON树的链接,因此您可以查看数据的结构。
有没有一种方法可以“跳过”一个孩子来读取下一个孩子,因为它包含您要在特定案例/方法中使用的特定数据,并返回那个数据,还是必须始终按顺序进行?我是否需要查询该数据才能使帖子显示在用户的个人资料中?
发布了数据库的图像链接。希望有人可以提供帮助。
ProfileFragment.java
private void myAttendingEvent() {
eventsImAttendingSecondButton = new ArrayList<>();
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event");
Query query = reference.orderByChild(firebaseUser.getUid());
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren())
if (snapshot.exists()) {
eventsImAttendingSecondButton.add(snapshot.getKey());
}
readSaves();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void readSaves() {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
postList_attendingEvent.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Post post = snapshot.getValue(Post.class);
for (String id : eventsImAttendingSecondButton) {
if (post.getPostid().equals(id)) {
postList_attendingEvent.add(post);
}
}
}
Collections.reverse(postList);
eventsImagesAdapter_attendingEvent.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
第二种方法,我尝试检索postid
。在我看来,这应该可行,但是我什么也没收回。如果用户点击“出席”事件,ChildEventListener应该读取该数据快照并将其显示在用户的个人资料中...
private void myAttendingEvent() {
eventsImAttendingSecondButton = new ArrayList<DataSnapshot>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event").child(postid);
reference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (snapshot.equals(firebaseUser.getUid()))
eventsImAttendingSecondButton.add(dataSnapshot);
}
readSaves();
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
readSaves();
}
答案 0 :(得分:0)
不确定是否有人真的需要此信息,但是在与ChildEventListener和ValueEventListener玩了两天之后,我发现我需要的确实是ValueEventListener终于实现了我的目标。希望它能对某人有所帮助!
我这样做的方式是这样的:
private void myAttendingEvent() {
eventsImAttendingSecondButton = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Attending Event");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
if (snapshot.hasChild(firebaseUser.getUid())){
eventsImAttendingSecondButton.add(snapshot.getKey());
}
}
readSaves();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}