Java Firebase for Android,如何循环遍历一个子项(对于每个子项=x do y)
这就是我的测试结果: 我不会使用上面的字段,它只是一个虚拟的。但我想通过“用户”上的所有子项,并为每封电子邮件返回一个:Java Firebase for Android,如何循环遍历一个子项(对于每个子项=x do y),java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,这就是我的测试结果: 我不会使用上面的字段,它只是一个虚拟的。但我想通过“用户”上的所有子项,并为每封电子邮件返回一个: System.out.println(emailString); 我发现列出对象的唯一方法是使用firebaseAdapter,还有其他方法吗?最简单的方法是使用ValueEventListener FirebaseDatabase.getInstance().getReference().child("users") .addListen
System.out.println(emailString);
我发现列出对象的唯一方法是使用firebaseAdapter,还有其他方法吗?最简单的方法是使用ValueEventListener
FirebaseDatabase.getInstance().getReference().child("users")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
System.out.println(user.email);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
User
类可以这样定义:
class User {
private String email;
private String userId;
private String username;
// getters and setters...
}
假设您有一个对节点用户的引用,您可以按如下方式迭代节点:
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot child : dataSnapshot.getChildren() ){
// Do magic here
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {}
});
请注意,for循环中的
DataSnapshot子项将UID作为键,而不是用户。使用迭代器迭代DataSnapshot
public void onDataChange(DataSnapshot snapshot) {
Iterator<DataSnapshot> items = snapshot.getChildren().iterator();
int counter = 0;
while (items.hasNext()) {
DataSnapshot item = items.next();
Log.i("Result", "email" + item.child("email").getValue().toString());
Log.i("Result", "User ID" + item.child("userId").getValue().toString());
Log.i("Result", "User Name" + item.child("username").getValue().toString());
}
}
public void onDataChange(DataSnapshot快照){
迭代器项=snapshot.getChildren().Iterator();
int计数器=0;
while(items.hasNext()){
DataSnapshot item=items.next();
Log.i(“结果”、“电子邮件”+item.child(“电子邮件”).getValue().toString());
Log.i(“结果”,“用户ID”+item.child(“用户ID”).getValue().toString());
Log.i(“结果”、“用户名”+item.child(“用户名”).getValue().toString());
}
}
迭代器将遍历用户和项的所有子元素。next()您可以访问用户子元素的子元素我知道我回答得太晚了,但我必须
FirebaseDatabase.getInstance().getReference().child("users")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
String user = snapshot.child("email").getValue().toString();
System.out.println(user);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
此程序将打印所有用户电子邮件
我期望产量
my@email.com
jonathanwells@email.com
freddyreich@email.com
你是说。怎么了?嗨,这个代码很好用,谢谢。但是,由于某些原因,最后一封电子邮件重复了2次。没关系,已修复。现在我需要弄清楚如何在循环之后执行代码,我键入的每一个代码都在循环之前执行。这里的用户是什么?用户是模型类。我有点被用户模型部分卡住了,你能帮助我如何构造它吗?我很好奇,但不是很糟糕吗?我的意思是在这里它通过所有用户循环(DataSnapshot child:DataSnapshot.getChildren())
,因此如果我们有100个用户,那么加载它将花费很多时间。有没有办法解决这个问题?我的建议是限制通过下载的用户数量,或者你可以使用一个更好的多线程Genius!修正了我的问题,如果你不想使用模型类,这很好。。。我的原始思维发现不必要的模型类,比如脖子上的重物。。。我的原始思维我说这和其他答案有什么不同?这是@rubenlop88答案的复制粘贴,其中一行已更改。这应该是一个注释。@Emil Sierzega我应该只发布onDataChange()方法。
my@email.com
jonathanwells@email.com
freddyreich@email.com