WhatsApp 数据库中的消息是如何关联联系人的?

B2C Data Innovating with Forum and Technology
Post Reply
muskanislam99
Posts: 270
Joined: Thu Dec 26, 2024 5:46 am

WhatsApp 数据库中的消息是如何关联联系人的?

Post by muskanislam99 »

WhatsApp 的聊天消息与联系人之间的关联主要通过使用Jabber ID (JID) 来实现,这是 WhatsApp 内部用于唯一标识用户、群组和服务器的标准格式。由于聊天消息主要存储在用户设备的本地加密 SQLite 数据库中,我们主要讨论客户端数据库层面的关联方式。

核心关联机制:Jabber ID (JID)
JID 是一个类似于电子邮件地址的唯一标识符,其格式通常是 user@domain。在 WhatsApp 的上下文中:

客户端数据库中的关联方式(以 Android 平台为例)
在 Android 客户端的 SQLite 数据库文件(msgstore.db 和 wa.db)中,消息和联系人主要通过以下方式关联:

messages 表 (存储聊天消息):

这个表包含了所有聊天消息的详细信息。其中一个关键字段是 key_remote_jid。
key_remote_jid 字段:
对于私人聊天:它存储了与你聊天的另一方的 JID。
对于群组聊天:它存储了群组的 JID。这意味着,同一群组的所有消息的 key_remote_jid 都相同。
remote_resource_id 字段(针对群组消息):
在群组聊天中,key_remote_jid 标识的是群组本身,但消息是 尼泊尔 whatsapp 数据库 由群组内的某个成员发送的。remote_resource_id 字段则存储了实际发送该群组消息的成员的 JID。如果消息是你自己发送的,这个字段可能为空或指向你自己的 JID。
wa_contacts 表 (存储联系人信息):

这个表存储了 WhatsApp 用户的联系人信息。
jid 字段: 存储了每个联系人在 WhatsApp 上的 JID。
display_name 字段: 存储了该联系人在你手机通讯录中的名称,或其 WhatsApp 个人资料中设置的显示名称。
number 字段: 存储联系人的电话号码。
其他字段如 status(About 信息)、photo_ts(头像时间戳)等。
chat_list 表 (存储聊天列表):

这个表存储了所有已存在的聊天对话的基本信息(无论是个人还是群组)。
jid 字段: 存储了聊天对象的 JID(与 messages 表中的 key_remote_jid 概念一致)。
last_message_id、unread_count、sort_timestamp 等字段: 用于显示聊天列表中的概览信息。
关联过程的逻辑
当 WhatsApp 客户端显示聊天界面时,它会执行以下逻辑来关联消息和联系人:

显示聊天列表: 客户端从 chat_list 表中读取所有聊天记录,通过 jid 字段识别出每个聊天是与谁(个人 JID)或哪个群组(群组 JID)的对话。
显示特定聊天内容: 当你点击一个聊天进入对话界面时:
客户端会使用该聊天的 JID(即 chat_list 表中的 jid)来查询 messages 表中所有 key_remote_jid 匹配的消息。
对于每条消息,它会检查 key_from_me 字段来判断是谁发送的。
识别发送者名称:
如果 key_from_me 为 1(我发送),则显示“你”或我的名称。
如果 key_from_me 为 0(对方发送):
对于私人聊天,它会使用 key_remote_jid 去 wa_contacts 表中查找对应的 display_name,从而显示对方的名称。
对于群组聊天,它会使用 remote_resource_id(发送者的 JID)去 wa_contacts 表中查找对应的 display_name,从而显示群组中哪个成员发送了这条消息。
总结
WhatsApp 通过在 messages 表中记录消息关联的 JID(key_remote_jid 和 remote_resource_id),并在 wa_contacts 表中存储 JID 与联系人信息的映射,有效地将聊天消息与具体的联系人(或群组成员)关联起来。JID 作为核心的唯一标识符,在整个客户端数据库中起到了关键的关联作用,使得客户端能够准确地显示消息的发送者和接收者信息。
Post Reply