从FireBase(Android)检索特定数据

时间:2014-11-28 11:29:10

标签: java android eclipse firebase

我正在制作聊天应用,我有一个具有以下结构的Firebase。 Chat1,Chat2,Chat3 ...用于保存不同聊天组的数据。 Message1,Message2,Message3是第1组内的消息。它可以来自任何作者。

聊天

  • 客服1
    • 消息1
      • 作者1
      • MessageText中
    • 消息2
      • Author2
      • MessageText中
    • 消息3
      • 作者1
      • MessageText中
  • 客服2
    • 消息1
      • Author3
      • MessageText中
    • 消息2
      • Author4
      • MessageText中
    • 消息3
      • 作者1
      • MessageText中
  • Chat3

我想从“作者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”?

3 个答案:

答案 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