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
How to retrieve specific list of data from firebase
提问by Zeeshan Shabbir
I am new to firebase
and nosql
database
我是新来firebase
和nosql
数据库
I am trying to retrieve some specific data from a Firebase. I have a node universities
and that node has many unique identifier as node which has so more data into it. I want to retrieve name
from each node.
我正在尝试从 Firebase 检索一些特定数据。我有一个节点universities
,该节点有许多唯一标识符作为节点,其中包含更多数据。我想name
从每个节点检索。
Please have a look at this.
请看看这个。
What I have tried so far: I tried using addChildEventListener
but this only listens first child. I've debugged it and it was only showing the values of the first child of universities
node.
到目前为止我尝试过的:我尝试使用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 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);
...
}
...
}
回答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 addEventListener
method. You can use GenericTypeIndicator
in 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.
希望这个答案有帮助。