通过循环获取所有 Firebase 数据

问题描述

我有一个保存联系人的 firebase 数据库。我想获取所有联系人的号码并一一向他们发送消息。我读到它可以通过 for 循环完成,但循环只返回插入的最后一个数字,而不是所有数字。代码如下:

 dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            ArrayList<String> Userlist=new ArrayList<String>();

            for (DataSnapshot dsp : snapshot.getChildren())
               Userlist.add(String.valueof(dsp.getValue()));

           for(int i = 0; i<Userlist.size();i++)
{
show.setText(Userlist.get(i);
}
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

请告诉我一种方法,我可以通过它获取所有联系人的号码并逐个向他们发送消息。 发送消息的代码如下:

String phoneNumber="1234567890";

        String message="I need help";
        SmsManager smsManager=SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNumber,null,message,null);

我的数据库结构也附上了。请看一看并指导我。我会感谢你。

enter image description here

解决方法

我有一个保存联系人的 firebase 数据库。我想取 所有联系人的号码,并一一向他们发送消息。我读 它可以通过 for 循环完成,但循环只返回最后一个 插入的数字,不是所有的数字。

问题是您试图通过循环将 ArrayList 项设置为 TextView

for(int i = 0; i<Userlist.size();i++){
    show.setText(Userlist.get(i);
}

使用循环将文本设置为 TextView 会在循环的每一步更改 TextView 的文本,因此 TextView 将仅显示列表的最后一项。如果您只使用 ArrayListString 放入其中并为 TextView 设置(根据您的代码),则使用 ArrayList 是没有用的。 在获取数据之前在 onDataChange() 方法中创建一个空的 String,并在获取数据时使用数据扩展 String。在 for 循环结束时,String 文本将包含所有数据,您可以将其设置为 TextView

dbRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
         String text = "";
         for (DataSnapshot dsp : snapshot.getChildren()){
             Map<String,Object> datas = (Map<String,Object>) dsp.getValue();
             text += datas.get("number").toString() + "\n";
         }
         tv.setText(text);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
    }
});

请告诉我一种可以获取所有号码的方法 联系并一一向他们发送消息。

您有 2 个获取值的选项。您可以使用 Map,也可以创建您的 Java Object

使用地图:

private void sendMessage(DatabaseReference dbRef) {
        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                SmsManager smsManager= SmsManager.getDefault();
                for (DataSnapshot dsp: snapshot.getChildren()){
                    Map<String,Object>) dsp.getValue();
                    String phoneNumber = datas.get("number").toString();
                    String message="I need help";
                    smsManager.sendTextMessage(phoneNumber,null,message,null);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
}

使用 Java 对象:

如果你想使用 Java Object,你需要创建一个类,它有一个像数据库结构这样的字段(字段必须与联系人孩子一样)。

Users.class (Java Object):

public class Users {

    private String name,number,email;

    public Users() {
    }

    public Users(String name,String number,String email) {
        this.name = name;
        this.number = number;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

然后您可以将数据作为对象获取。

private void sendMessage(DatabaseReference dbRef) {
        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                SmsManager smsManager= SmsManager.getDefault();
                for (DataSnapshot dsp: snapshot.getChildren()){
                    Users user = dsp.getValue(Users.class);
                    String phoneNumber = user.getNumber();
                    String message="I need help";
                    smsManager.sendTextMessage(phoneNumber,null);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
            }
        });
}

这两种 sendMessage() 方法都是根据给定的 DatabaseReference 从数据库中获取数据并使用您的代码发送消息。

,

试试这个

for(int i = 0; i<Userlist.size();i++)
     {
       show.append(userlist.get(i)+",");
        } 

你的所有号码都用这个显示