电话簿中的联系人姓名,包含Firebase中的号码

时间:2017-07-01 08:34:10

标签: android listview firebase firebase-realtime-database android-contacts

在我的应用程序中,我使用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) {
        }
    });

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

目前我从服务器获取所有号码,但我需要过滤正确的联系人,我需要显示联系人的姓名。

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

提前谢谢!

1 个答案:

答案 0 :(得分:1)

你必须:

  1. 通过本地电话簿查找每个联系人的电话号码。
  2. 为每个号码执行Firebase查询。
  3. 将生成的联系人(如果有)添加到列表/适配器并更新视图。
  4. 所以说你已经完成了第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。性能主要取决于您在数据库中拥有的用户数量,但最多可达数十万,这应该没问题。