gpt4 book ai didi

android - Firebase 数据库如何根据子值获取节点?

转载 作者:行者123 更新时间:2023-11-29 15:00:44 24 4
gpt4 key购买 nike

实际上我只想获取在线用户,而不是整个用户列表。这是我的数据库结构:

Users
- Uid
- online : true

我想获取在线用户的列表,而不需要获取每个用户然后通过检查数据快照对其进行排序。

最佳答案

假设 Users 节点是 Firebase 根的直接子节点,我建议您使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef
.child("Users")
.child("Uid")
.orderByChild("online")
.equalTo(true);
query.addListenerForSingleValueEvent(/* ... */);

Edit1:如果您没有每个用户的uid,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("Users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String uid = ds.getKey();
Query query = usersRef.child(uid).orderByChild("online").equalTo(true);
query.addListenerForSingleValueEvent(/* ... */);
}
}

@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);

Edit2: 正如您在官方文档中看到的那样,addListenerForSingleValueEvent在此位置为数据的单个更改添加一个监听器。此监听器将使用该位置的数据值触发一次。

当你写入数据时,如果你想知道你的数据何时被提交,你可以添加一个OnCompleteListener。当任务完成时调用。 setValue()updateChildren() 方法都采用可选的完成监听器,当写入已提交到数据库时调用该监听器。这是一个例子:

yourRef.setValue("I'm writing data", new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
if (firebaseError != null) {
System.out.println("Data could not be saved. " + firebaseError.getMessage());
} else {
System.out.println("Data saved successfully.");
}
}
});

关于同步,有一种通用方法可以检测 Firebase 何时完成给定位置上初始数据的同步。这种方法利用了 Firebase event guarantees 之一:

Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.

因此,如果您在给定位置同时拥有 ValueEventListenerChildEventListener,则可以保证调用 ValueEventListener.onDataChange()在所有 onChildAdded() 调用发生之后。

但要记住一件事:Firebase 不只是加载数据。它不断地将数据从服务器同步到所有连接的客户端。因此,实际上没有任何时刻可以完全检索数据。这就是为什么您需要删除监听器的原因,如下所述。

此外,请注意,您可以随时删除监听器。最佳做法是根据 Activity 的生命周期将其删除。

如果您在 onStart 中添加了监听器,则必须在 onStop 中将其删除。如果您在 onResume 中添加了监听器,则必须在 onPause 中将其删除。如果您在 onCreate 中添加了监听器,则必须在 onDestroy 中将其删除。但请记住 onDestroy 并不总是被调用。

databaseReference.removeEventListener(valueEventListener);

关于android - Firebase 数据库如何根据子值获取节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46275462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com