我正在制作聊天应用,我有一个具有以下结构的Firebase。 Chat1,Chat2,Chat3 ...用于保存不同聊天组的数据。 Message1,Message2,Message3是第1组内的消息。它可以来自任何作者。
聊天
我想从“作者1”中检索所有消息的列表。含义Message1,Message3应该从Chat1中检索,而Message3也应该从Chat2中检索。我想显示来自1位作者的所有消息。
ref = new Firebase(FIREBASE_URL); //Root URL
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
for (DataSnapshot childd : child.getChildren()) {
//This might work but it retrieves all the data
}
}
}
@Override
public void onCancelled() {
}
});
这给了我全部数据!如何将其限制为“Author1”?
答案 0 :(得分:11)
Firebase将始终检索您要求的完整节点。既然你要求一次聊天或整个聊天(你不清楚你的代码是哪一个),那就是你得到的。
如果您想从Firebase获取更少的数据,您必须更加具体地了解您的要求。例如,如果要显示Chat1,则首先侦听Chat1节点的子项。
此代码段来自Firebase guide for Android:
// Retrieve new posts as they are added to Firebase
ref.addChildEventListener(new ChildEventListener() {
// Retrieve new posts as they are added to Firebase
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
Map<String, Object> newPost = (Map<String, Object>) snapshot.getValue();
System.out.println("Author: " + newPost.get("author"));
System.out.println("Title: " + newPost.get("title"));
}
//... ChildEventListener also defines onChildChanged, onChildRemoved,
// onChildMoved and onCanceled, covered in later sections.
});
此代码段与您当前的示例完成相同的操作,但Firebase不是使用for
循环覆盖数据,而是一次向您提供一条消息。
有了这些,您可以过滤消息。这是一个两步过程:首先按子节点排序,然后限制返回哪些节点。
Query query = ref.orderByChild("Author").equalTo("Author1", "Author");
query.addChildEventListener(new ChildEventListener() {
// the rest of the code remains the same as above
最后一点最好在Firebase documentation on queries中解释。
答案 1 :(得分:1)
我不知道这是不是你的意思,但这是我的数据库代码。首先是我的数据库结构:
*数据库根
:用户
:.... USERNAME1
::
:: ......“名称”:“价值”
:: ......“电子邮件”:“价值”
:: ......“密码”:“价值”
:.... USERNAME2
::
:: ......“名称”:“价值”
:: ......“电子邮件”:“价值”
:: ......“密码”:“价值”
以下是我从数据库中检索数据的代码:
FirebaseDatabase database= FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference().child("Users");
login=myRef.child(name); //here user will sign in using his name so it is based on user, directory will change dynamically
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
String demo=user.Email;
//email fetched from database
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
login.addValueEventListener(listener);
这里User.java类包含3个字符串值的电子邮件,密码和&amp;名。
public class User {
public String Name;
public String Email;
public String Password;
public User() {
// Default constructor required for calls to DataSnapshot.getValue(User.class)
}
public User(String name,String pass, String email) {
this.Name = name;
this.Email = email;
this.Password = pass;
}
}
答案 2 :(得分:1)
您可以使用查询过滤结果
DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference("Chat1");
Query query = mDatabaseReference.orderByChild("authorName").equalTo("Author1");
此外,还可以使用其他过滤方法: https://firebase.google.com/docs/reference/android/com/google/firebase/database/Query