android - 比较两个非常大的 ArrayList,其中一个是从 firebase 检索到的
Posted
技术标签:
【中文标题】android - 比较两个非常大的 ArrayList,其中一个是从 firebase 检索到的【英文标题】:android - Comparing two very large ArrayLists one of them retrieved from firebase 【发布时间】:2020-04-29 15:54:42 【问题描述】:所以现在我正在尝试显示仅存在于 firebase 数据库“用户”表中的联系人,
所以第一步是获取我所有的联系人(在不到一秒的时间内完美完成) 第二个是检索我数据库中的所有用户,只是为了比较两个 Arraylist 以检查我的任何联系人是否存在于数据库中,如果存在则显示它们(实际上是这种情况)
我已经这样做了,但我 100% 确定这是一个太慢的算法! ,
如果数据库中有 200 万个用户,而我有 1000 个联系人,那么 1000 * 2,000,000 !!显示我唯一存在于 firebase 数据库中的联系人将需要很长时间,
有什么解决办法吗?
这是我的代码
`
// this means it will load the whole users from database !
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
databaseReference.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot dataSnapshot)
contactsList.clear();
// this algorithm means that if there is one million records it will loop through
//all of them
// then add all of them to the list
// takes lots of time actually :(
for(DataSnapshot snapshot : dataSnapshot.getChildren())
User user = snapshot.getValue(User.class);
for(Contacts contacts : PhonecontactsList)
// if this user phone eqauals the phone we saved in the phone array list
if(user.getPhone().equals(contacts.getPhone()))
// if the user doesn't exist in the list
if (!contactsList.contains(user))
// add them
contactsList.add(new User(
user.getId(),
contacts.getUsername(),
user.imageURL,
user.getStatus(),
user.getPhone(),
user.getTyping_to(),
user.getSearch(),
user.getTimestamp()
));
UsersAdapter usersAdapter = new UsersAdapter(getContext(), contactsList , false);
contactsRecycler.setAdapter(usersAdapter);
@Override
public void onCancelled(DatabaseError databaseError)
);
`
提前致谢!
【问题讨论】:
【参考方案1】:从 Firebase 实时数据库等云托管数据库中获取全部 100 万条记录是一个非常糟糕的主意。通过移动连接传输所有这些记录是不可能的。最终用户还可能会花费大量的数据配额来获得整套数据。
如果您只需要知道哪些数据库记录在您的本地数据集中,只需对本地数据集中的每个项目进行一次请求,并显示存在的那些。您可以忽略其他所有内容。
【讨论】:
以上是关于android - 比较两个非常大的 ArrayList,其中一个是从 firebase 检索到的的主要内容,如果未能解决你的问题,请参考以下文章