像WhatsApp这样的应用程序如何显示仅使用该应用程序的联系人?

11

在使用电话验证的应用程序中,例如 WhatsApp:

当任何用户打开以查看他/她的联系人时,WhatsApp将仅显示使用WhatsApp的来自您的手机的联系人(就像它们筛选您的联系人一样)。

我对实现类似功能的想法:

我可以将所有用户保存在数据库中(当他们使用我的应用程序进行身份验证时),现在当我在活动中加载联系人时,我检查联系人是否存在于数据库中,如果该用户存在,则将其添加到列表中。

问题:

如果我使用上述方法:

假设我有10,000个用户在数据库中,则每次我想要在我的应用程序内显示用户的联系人时循环遍历这10,000个用户就没有意义了。

问题:

您认为 WhatsApp 等应用程序如何实现这样的功能?


1
你所询问的搜索可能使用数据库中的索引来显著提高速度。它不会为每个用户执行线性搜索,因为那将花费太多时间,正如你所说的那样。在第一次查找用户之后,你可以将其存储在自己的数据库中。 - Code-Apprentice
@Code-Apprentice如果我在读取一次后将它们存储在本地,那么如果我的联系人列表中有一个人删除了他/她的帐户,该如何处理呢? - data
您可以定期迭代本地数据库中的用户,以检查他们是否已被删除/停用。 - Code-Apprentice
请查看我的答案:https://stackoverflow.com/a/64399981/13124119 - Kamal Panara
1个回答

9
你必须至少遍历一次拥有联系人的用户,但你可以像WhatsApp一样聪明地处理它。
当用户第一次打开和注册WhatsApp时,他们会询问您是否允许读取您的联系人 (从API Level 23),当用户授予权限后,WhatsApp在后台连接到其后端服务器(其中保存了所有用户数据),并返回此HTTP请求中可用的联系人,仅以其帐户信息返回已在WhatsApp上注册的那些号码,然后WhatsApp在本地保存它们的设备(SQLite或任何数据库相关服务)中,并且当用户打开WhatsApp的联系人活动时,它显示来自本地用户数据库而不是服务器的数据。
现在的问题是:当添加新联系人时会发生什么?
如果用户创建新联系人,WhatsApp将获得通知,然后WhatsApp再次连接到其后端服务器,使用新联系人的号码。现在假设用户在创建新联系人时没有连接到互联网,那么会发生什么? WhatsApp将将该号码保存到其本地数据库的另一个表中作为未检查的号码,然后一旦用户连接到互联网,whatsapp将再次连接到其具有相同类型请求的后端服务器。此外,在WhatApp的联系人活动中,还有一个名为“强制刷新”的选项,它执行相同的操作,但不在后台执行。对于删除联系人,情况也是相同的,只是不需要连接到服务器,它实际上会从用户本地数据库中删除WhatsApp联系人。 现在问题是这样做的好处是什么?
  • 小数据使用量,这对用户体验非常有益。
  • 每次用户打开联系人活动时无需联系服务器。 这对用户体验也非常有利。

运行时权限是在API级别23而不是21中添加的。 - Mohammed Farhan
现在你的意思是我只需要检查用户是否存在于数据库中一次,并将它们保存在本地......另一个问题浮现在我的脑海中:如果一个用户从数据库中删除(换句话说,一个用户决定删除他/她的账户,而他/她出于某种原因是我的联系人...我的本地列表应该如何刷新?) - data
每天在某个时间间隔内,您必须检查用户的联系人列表,就像用户第一次打开应用程序时一样。如果用户不在服务器响应列表中,但在您的应用程序的联系人列表中,则从您的应用程序的联系人列表数据库中删除该帐户,并在用户强制刷新联系人时执行相同的操作。 - Sayan Roy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接