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

相關問題