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

a6b3iqyw  于 2023-02-25  发布在  其他
关注(0)|答案(5)|浏览(157)

我不熟悉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,它监听整个节点并返回整个数据,但我无法提取"name",因为它包含唯一标识符。
请给我指路。

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

        }
    });
nle07wnf

nle07wnf1#

如果您使用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);
         ...
    }
    ...
}
hfyxw5xn

hfyxw5xn2#

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

希望这个答案能有所帮助。

okxuctiv

okxuctiv3#

您可以使用Query的equalTo(),其中您可以传递自定义字符串以与firebase数据库匹配。
您可以使用这种方法创建查询并设置侦听器

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

有关详细信息,请参阅this线程。
Here是firebase官方提供的一个很好的例子,参考一下,你就会明白了

zpqajqem

zpqajqem4#

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%有效

klr1opcd

klr1opcd5#

我也遇到过同样的问题,你可以在Model类中改变访问说明符,即public到private,这样问题就解决了

相关问题