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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/38652007/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 20:29:36  来源:igfitidea点击:

How to retrieve specific list of data from firebase

javaandroidjsonfirebasefirebase-realtime-database

提问by Zeeshan Shabbir

I am new to firebaseand nosqldatabase

我是新来firebasenosql数据库

I am trying to retrieve some specific data from a Firebase. I have a node universitiesand that node has many unique identifier as node which has so more data into it. I want to retrieve namefrom each node.

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

Please have a look at this.

请看看这个。

enter image description here

在此处输入图片说明

What I have tried so far: I tried using addChildEventListenerbut this only listens first child. I've debugged it and it was only showing the values of the first child of universitiesnode.

到目前为止我尝试过的:我尝试使用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) {

        }
    });

I have also tried addValueEventListener. This listens the whole node and return whole data, but I am unable to extract "name" for it since it contains unique identifiers.

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

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

        }
    });

采纳答案by Phan Van Linh

If you using addValueEventListenerfor 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);
         ...
    }
    ...
}

回答by Ravi

You can use equalTo() of Queryin 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 queryRef = myFirebaseRef.orderByChild("name").equalTo("some name");

refer thisthread for more.

有关更多信息,请参阅线程。

Hereis nice example from firebase officials, refer that and you will get clear idea

是来自 firebase 官员的很好的例子,参考它,你会得到清晰的想法

回答by frankenstein

   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%它会起作用

回答by Robert

Regarding Linh's answer about using the addEventListenermethod. You can use GenericTypeIndicatorin order to directly create the list of objects you'll be needing. Here's a quick example:

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

Hope this answer helps.

希望这个答案有帮助。