【问题标题】:How to retrieve specific list of data from firebase如何从firebase中检索特定的数据列表
【发布时间】:2016-12-03 18:27:24
【问题描述】:

我是 firebasenosql 数据库的新手

我正在尝试从 Firebase 检索一些特定数据。我有一个节点universities,并且该节点具有许多唯一标识符作为节点,其中包含更多数据。我想从每个节点检索name

请看这个。

到目前为止我已经尝试过:我尝试使用 addChildEventListener 但这只会听第一个孩子。我已经调试过了,它只显示了universities 节点的第一个子节点的值。

myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            List<University> university = new ArrayList<>();
            Map<String, Object> td = (HashMap<String, Object>) dataSnapshot.getValue();

            Log.d("TAG",dataSnapshot.getValue().toString());
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我也试过addValueEventListener。这会监听整个节点并返回整个数据,但我无法为其提取“名称”,因为它包含唯一标识符。

请指引我正确的方向。

myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                University university = dataSnapshot.getValue(University.class);
                List<University> universities = (List<University>) dataSnapshot.getValue(University.class);
                *//*List<String> lst = new ArrayList<String>();

            for(DataSnapshot dsp : dataSnapshot.getChildren()){
                lst.add(dsp.getKey());
            }
            Log.d("TAG",lst.toString());*//*

            Map<String, Object> td = (HashMap<String, Object>) dataSnapshot.getValue();


            *//*List<Object> values = new ArrayList<Object>(td.values());
            List<String> list=new ArrayList<String>();
            for(int i=0; i<values.size(); i++){
                list.add((String) values.get(i));
            }*//*
            Log.d("TAG", university.toString());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

【问题讨论】:

    标签: java android json firebase firebase-realtime-database


    【解决方案1】:

    如果您使用 addValueEventListener 从 Firebase 检索所有大学

    List<University> universityList = new ArrayList<>();
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            universityList.clear();
            for (DataSnapshot postSnapshot: snapshot.getChildren()) {
                University university = postSnapshot.getValue(University.class);
                universityList.add(university);
    
                // here you can access to name property like university.name
    
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });
    

    或者如果你使用addChildEventListener

    List<University> universityList = new ArrayList<>();
    myRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
             University university = dataSnapshot.getValue(University.class);
             universityList.add(university);
             Log.i(TAG,"add university name = " + university.name);
             ...
        }
        ...
    }
    

    【讨论】:

    • 好的,我使用了第一种方法。那个方法。将 hashMap 类型的数据存储到列表中。我的意思是它现在总共有 3 个索引。并且每个索引都包含 HashMap 类型的数据。我想从中得到名字。我该怎么做?
    • 我看到您在帖子中使用 using 的方式有所不同。在我的代码中(在一种方法中),在 for 循环中,您将获得 Univerty 对象,并使用可以通过 university.name 访问 name 属性
    【解决方案2】:

    您可以使用Query 的equalTo(),您可以在其中传递您的自定义字符串以匹配firebase 数据库。

    像这样,您可以创建查询并使用它设置侦听器

    Query queryRef = myFirebaseRef.orderByChild("name").equalTo("some name");
    

    请参阅this 线程了解更多信息。

    Here 是来自 firebase 官员的好例子,参考一下,你就会明白了

    【讨论】:

    • 这个查询会从大学节点的每个子节点返回我的名字吗? Query queryRef = myFirebaseRef.orderByChild("name") ?
    • @Zeeshan Shabbir 不,它会返回所有按属性名称值排序的用户。
    【解决方案3】:

    关于 Linh 关于使用 addEventListener 方法的回答。您可以使用GenericTypeIndicator 直接创建您需要的对象列表。这是一个简单的例子:

    List<University> universityList = new ArrayList<>();
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            GenericTypeIndicator<List<University>> t = new GenericTypeIndicator<List<University>>() {};
            universityList = snapshot.getValue(t);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });
    

    希望这个答案有帮助。

    【讨论】:

    • 使用此方法,请确保您上传的数据完全是setValue()的单个List对象,而不是.push().setValue(),否则会出现此异常:Expected a List while deserializing, but got a class java.util.HashMap
    【解决方案4】:
       public void onDataChange(DataSnapshot dataSnapshot) {
               for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                   User user = postSnapshot.getValue(User.class);
                   list.add(user);
               }
           }
    

    类用户

    class User{
    
    String name;
    
    String phone;
    
    public String getname() {
        return name;
    }
    
    public void setname(String name) {
        this.name = name;
    }
    
    
    public String getphone() {
        return phone;
    }
    
    public void setphone(String phone) {
        this.phone = phone;
    }
    

    列表与类绑定

    List<User> list== new ArrayList <>();
    

    100% 会起作用

    【讨论】:

    • 点评来源: 您好,请不要只用源代码回答。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2018-02-25
    相关资源
    最近更新 更多