0

在我的应用程序中,我使用Firebase检索用户的移动电话号码。所以我用这个代码:电话簿中的联系人姓名与Firebase中的电话号码

databaseUsers.orderByChild("uid").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      users.clear(); 
      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       User contactlists = postSnapshot.getValue(User.class); 
       users.add(contactlists); 
      } 
      ContactList contactAdapter = new ContactList(ContactListActivity.this, users); 
      listViewContacts.setAdapter(contactAdapter); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

现在我有以下问题:如果用户的数量高,是有仅发送电话簿的mobilnumbers也许在列表的可能性?否则,我认为Firebase的流量可能不是那么高效?! 另一个机会是单独发送每个号码,但如果用户有很多联系人,这可能会非常复杂。

目前我从服务器获取所有数字,但我需要筛选正确的联系人,我需要显示联系人的名称。

什么是尽可能高效使用Firebase并获取联系人姓名的最佳解决方案?

预先感谢您!

回答

1

你必须:

  1. 遍历本地电话簿找到每个联系人的电话号码。
  2. 对每个号码执行Firebase查询。
  3. 将生成的联系人(如果有)添加到列表/适配器并更新视图。

所以说你已经完成了第1步,并有一个电话号码列表。然后,你遍历这些并为每个:

for (String phonenumber: phonenumbers) { 

    Query query = databaseUsers.orderByChild("phonenumber").equalTo(phonenumber); 

    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      User contactlists = postSnapshot.getValue(User.class); 
      users.add(contactlists); 
      adapter.notifyDataSetChanged(); 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      throw databaseError.toException(); // don't ignore erors 
     } 
    }); 
} 

notifyDataSetChanged()调用确保适配器知道它需要更新视图。

虽然代码有点复杂,但它并不象您最初担心的那样慢,因为Firebase pipelines the requests over a single connection。性能将主要取决于您在数据库中拥有的用户数量,但最高可达几十万,这应该没问题。

+0

这里当手机号码是不同的像火力点保存+91和联系时没有+91那么我该怎么做? – user7176550

相关问题