简体   繁体   English

如何从firebase检索特定的数据列表

[英]How to retrieve specific list of data from firebase

I am new to firebase and nosql database 我是firebasenosql数据库的新手

I am trying to retrieve some specific data from a Firebase. 我正在尝试从Firebase中检索一些特定数据。 I have a node universities and that node has many unique identifier as node which has so more data into it. 我有一个节点universities ,该节点有许多唯一标识符作为节点,它有更多的数据。 I want to retrieve name from each node. 我想从每个节点检索name

Please have a look at this. 请看看这个。

在此输入图像描述

What I have tried so far: I tried using addChildEventListener but this only listens first child. 到目前为止我尝试过:我尝试使用addChildEventListener但这只是监听第一个孩子。 I've debugged it and it was only showing the values of the first child of universities node. 我调试了它,它只显示了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) {

        }
    });

I have also tried addValueEventListener . 我也尝试过addValueEventListener This listens the whole node and return whole data, but I am unable to extract "name" for it since it contains unique identifiers. 这会侦听整个节点并返回整个数据,但我无法为其提取“名称”,因为它包含唯一标识符。

Please guide me into the right directions. 请引导我进入正确的方向。

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) {

        }
    });

If you using addValueEventListener for retrieve all university from Firebase 如果您使用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());
    }
});

Or if you using addChildEventListener 或者如果您使用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);
         ...
    }
    ...
}

You can use equalTo() of Query in which you can pass your custom string to match with firebase database. 您可以使用Query的 equalTo(),您可以在其中传递自定义字符串以与firebase数据库匹配。

like this way you can create your Query and set listener with that 像这样你可以用它创建你的Query并设置监听器

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

refer this thread for more. 请参阅主题以获取更多信

Here is nice example from firebase officials, refer that and you will get clear idea 是firebase官员的一个很好的例子,请参考,你会得到清晰的想法

   public void onDataChange(DataSnapshot dataSnapshot) {
           for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
               User user = postSnapshot.getValue(User.class);
               list.add(user);
           }
       }

class 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 bind with class 列出与类绑定

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

100% it will work 100%它会工作

Regarding Linh's answer about using the addEventListener method. 关于Linh关于使用addEventListener方法的答案。 You can use GenericTypeIndicator in order to directly create the list of objects you'll be needing. 您可以使用GenericTypeIndicator直接创建您需要的对象列表。 Here's a quick example: 这是一个简单的例子:

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

Hope this answer helps. 希望这个答案有所帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM