【问题标题】:Retrieving Specific Data from FireBase (Android)从 FireBase (Android) 检索特定数据
【发布时间】:2014-11-28 11:29:09
【问题描述】:

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

聊天

  • 聊天1
    • 消息1
      • 作者1
      • 消息文本
    • 消息2
      • 作者2
      • 消息文本
    • 消息3
      • 作者1
      • 消息文本
  • 聊天2
    • 消息1
      • 作者3
      • 消息文本
    • 消息2
      • 作者4
      • 消息文本
    • 消息3
      • 作者1
      • 消息文本
  • 聊天3

我想检索来自“作者 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”?

【问题讨论】:

    标签: java android eclipse firebase


    【解决方案1】:

    Firebase 将始终检索您请求的完整节点。由于您同时要求所有聊天或整个聊天(不清楚您从代码中执行哪一个),这就是您得到的。

    如果您想从 Firebase 获取更少的数据,您必须更具体地说明您的要求。例如,如果您想显示 Chat1,则首先侦听 Chat1 节点的 子节点。

    这个sn-p来自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.
    });
    

    此 sn-p 与您当前的示例完成相同的操作,但不是您的代码使用 for 循环遍历数据,而是 Firebase 一次向您提供一条消息。

    有了它,您就可以过滤消息了。这是一个两步过程:首先按子节点排序,然后限制返回的节点。

    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 中解释。

    【讨论】:

    • 感谢您的回复,我会试试这个...看起来我正在使用旧的 Firebase 库。
    • 我升级了库并尝试了各种方法,我能够从 1 个作者的 1 个节点检索消息。但我想从所有节点检索作者 1 的所有消息。
    • 啊哈......目前不可能。 orderByChild 更深一层。您始终可以构建自己的索引,将消息映射到作者。见stackoverflow.com/questions/16638660/…。这也是在 Firebase 添加 orderByChild 方法之前执行此操作的方法,因此其他较旧的答案可能包含很好的示例供您查看。
    【解决方案2】:

    我不知道这是否是您的意思,但这是我的数据库代码。首先是我的数据库结构:

    *数据库根目录

    :用户

    :

    :....用户名1

    : :

    : :......"名称":"值"

    : :......"电子邮件":"价值"

    : :......"密码":"值"

    :

    :....用户名2

    : :

    : :......"名称":"值"

    : :......"电子邮件":"价值"

    : :......"密码":"值"

    这是我从数据库中检索数据的代码:

    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 个字符串值,分别是电子邮件、密码和姓名。

    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;
    }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用查询来过滤结果

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-09
        • 2020-07-15
        • 2018-10-04
        • 2018-02-25
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多