簡體   English   中英

如何從firebase檢索特定的數據列表

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

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

        }
    });

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

您可以使用Query的 equalTo(),您可以在其中傳遞自定義字符串以與firebase數據庫匹配。

像這樣你可以用它創建你的Query並設置監聽器

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

請參閱主題以獲取更多信

是firebase官員的一個很好的例子,請參考,你會得到清晰的想法

   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%它會工作

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

希望這個答案有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM