【问题标题】:Getting all firebase data through loop通过循环获取所有firebase数据
【发布时间】:2021-05-28 14:35:57
【问题描述】:

我有一个保存联系人的 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,null);

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

【问题讨论】:

    标签: android database loops firebase-realtime-database smsmanager


    【解决方案1】:

    我有一个保存联系人的 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> datas = (Map<String, Object>) dsp.getValue();
                        String phoneNumber = datas.get("number").toString();
                        String message="I need help";
                        smsManager.sendTextMessage(phoneNumber,null,message,null,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,message,null,null);
                    }
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError error) {
                }
            });
    }
    

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

    【讨论】:

      【解决方案2】:

      试试这个

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 2019-11-03
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        相关资源
        最近更新 更多