当前位置: 首页 > news >正文

Messaging 数据库结构入门指南

Messaging 数据库结构入门指南

适合刚接触短信应用开发的同学,帮助快速理解数据是怎么存储的。


一、整体概览

短信应用的数据存在一个叫bugle_db的 SQLite 数据库里。
核心文件是:

src/com/android/messaging/datamodel/DatabaseHelper.java

整个数据库可以用一句话概括:

会话(Conversations)包含消息(Messages),消息包含附件(Parts),参与者(Participants)关联到会话。


二、核心表结构

1. conversations — 会话表

作用:每一行代表一个聊天窗口(一个联系人或一个群组)。

字段名类型说明
_idINTEGER PK主键,自增
sms_thread_idINT对应系统短信 thread_id
nameTEXT会话显示名称
snippet_textTEXT列表页显示的最新一条消息摘要
sort_timestampINT排序时间戳(决定列表顺序)
archive_statusINT是否归档(0=正常,1=已归档)
is_topINT是否置顶
participant_countINT参与人数
notification_enabledINT是否开启通知
current_self_idTEXT当前使用的 SIM 卡参与者 ID

提示:打开短信列表,每一行对应这张表的一条记录。


2. messages — 消息表

作用:存储每一条具体的短信/彩信/RCS 消息。

字段名类型说明
_idINTEGER PK主键,自增
conversation_idINT所属会话(外键 → conversations._id)
sender_idINT发送者(外键 → participants._id)
self_idINT接收者/自己(外键 → participants._id)
sent_timestampINT发送时间(毫秒时间戳)
received_timestampINT接收时间
message_protocolINT协议类型(0=SMS,1=MMS,2=RCS)
message_statusINT消息状态(发送中/已发送/失败/已接收等)
readINT是否已读(0=未读,1=已读)
seenINT是否已在通知栏展示过
sub_idINT使用哪张 SIM 卡发送

提示:进入某个会话后,聊天气泡列表对应这张表的记录,通过conversation_id过滤。


3. parts — 附件/内容表

作用:存储消息的具体内容,包括文字、图片、音频、视频等。
一条消息(message)可以有多个 part(比如彩信里同时有文字和图片)。

字段名类型说明
_idINTEGER PK主键,自增
message_idINT所属消息(外键 → messages._id)
conversation_idINT所属会话(外键 → conversations._id)
textTEXT文字内容(纯短信的正文在这里)
uriTEXT媒体文件的 URI 路径
content_typeTEXTMIME 类型(如 text/plain、image/jpeg)
width/heightINT图片/视频的宽高
attachment_sizeDOUBLE附件大小(字节)
audio_timeTEXT音频时长

提示

  • 普通短信:一条 message 对应一个 part,content_type = "text/plain",正文在text字段。
  • 彩信/RCS:一条 message 可能对应多个 part,分别存图片、文字等。

4. participants — 参与者表

作用:存储所有联系人/自己的信息,类似一个本地通讯录缓存。

字段名类型说明
_idINTEGER PK主键,自增
normalized_destinationTEXT标准化手机号(E164格式,如 +8613800138000)
send_destinationTEXT实际拨号用的号码
display_destinationTEXT界面展示用的号码
full_nameTEXT联系人全名
profile_photo_uriTEXT头像 URI
contact_idINT系统通讯录中的联系人 ID
sub_idINTSIM 卡 ID(自己的参与者记录用)
blockedINT是否被拉黑

提示sub_id = -1的记录代表对方联系人,sub_id >= 0的代表本机 SIM 卡(即"自己")。


5. conversation_participants — 会话参与者关联表

作用:多对多关联表,记录哪些参与者在哪个会话里(群发/群聊用)。

字段名类型说明
_idINTEGER PK主键
conversation_idINT外键 → conversations._id
participant_idINT外键 → participants._id

三、表关系图

participants (参与者) │ │ sender_id / self_id ▼ conversations (会话) ──────────── conversation_participants │ │ │ conversation_id │ participant_id ▼ ▼ messages (消息) participants │ │ message_id ▼ parts (附件/内容)

四、常见查询场景

查询某个会话的所有消息

SELECTm.*,p.text,p.content_type,p.uriFROMmessages mJOINparts pONp.message_id=m._idWHEREm.conversation_id=?ORDERBYm.received_timestampASC;

查询所有未读消息数

SELECTCOUNT(*)FROMmessagesWHEREread=0;

查询某个会话的参与者

SELECTpt.*FROMparticipants ptJOINconversation_participants cpONcp.participant_id=pt._idWHEREcp.conversation_id=?;

五、删除级联规则

数据库设置了ON DELETE CASCADE,删除时会自动清理关联数据:

删除 conversation → 自动删除所有关联的 messages 和 parts 删除 message → 自动删除所有关联的 parts

所以删会话不需要手动清消息,数据库会自动处理。


六、RCS 扩展字段说明

如果你看到字段名以rcs_开头,这些是 RCS(富媒体通信服务,即"5G消息")的扩展字段,普通短信不会用到,新手可以先忽略。

前缀所在表用途
rcs_message_idpartsRCS 消息唯一 ID
rcs_msg_statepartsRCS 消息状态(上传中/已发送等)
rcs_group_subjectconversationsRCS 群组名称
rcs_group_photo_uriconversationsRCS 群组头像

七、Content Provider URI

应用通过以下 URI 访问数据(不直接操作 SQLite):

URI说明
content://com.android.messaging/conversations会话列表
content://com.android.messaging/messages消息列表
content://com.android.messaging/participants参与者
content://com.android.messaging/sim_messagesSIM 卡短信

文档基于 Messaging 实际代码生成,核心文件:DatabaseHelper.java

http://www.jsqmd.com/news/652424/

相关文章:

  • 【THM-课程内容】:Privilege Escalation-Windows Privilege Escalation: Other Quick Wins
  • MCU驱动继电器的电路设计:从原理到实战避坑指南
  • Jasminum插件:中文文献管理的终极解决方案
  • 天赐范式第13天:科技项目实战篇2%轻掺杂实现热整流:混沌驱动的非线性声子玻璃(附A3级可视化+完整代码)
  • 保姆级教程:用Zemax 18.9复现单模光纤耦合仿真(附康宁SMF-28e参数)
  • 面试官: MySQL LIKE索引失效原因解析(答案深度解析)持续更新
  • SCI论文署名指南:通讯作者与共同通讯作者的权责与排序策略
  • 2026年4月昆明美术培训机构排名前十 - 云南美术头条
  • Java+YOLOv8+Redis实战:工业视觉检测缓存加速+实时数据同步,毫秒级生产级落地
  • 测试辅助工具__fiddler抓包基于windows下载安装及使用教程(详细版)
  • 2025届最火的六大降重复率方案推荐榜单
  • STM32 PWM模式全解析:从基础PWM到Combined PWM的进阶用法(避坑指南)
  • 深入解析特殊时序路径:从Unconstrained Path到False Path的实战策略
  • 2026年帮设计师快速生成交互流程的AI工具推荐:4款主流产品对比
  • 2026年值得关注的化妆学校,助力美妆梦想起航 - 品牌测评鉴赏家
  • 2026年AI搜索营销生成式优化领域核心服务商3强格局与能力洞察报告 - 商业小白条
  • 【AIGC生产环境生死线】:为什么传统RateLimiter在LLM调用中全面失灵?重写熔断器的3个底层协议适配关键点
  • 【项目实战】Windows 10 Docker Desktop 安装前置条件检测与解决方案
  • YOLOv8-Pose关键点检测实战:从图片到骨骼线绘制的保姆级避坑指南
  • 纯前端实现发票二维码批量识别——PDF.js + jsQR 实战
  • 图像质量评价指标全解析:SROCC、PLCC、KROCC到底怎么选?
  • 零基础学化妆|6家合规化妆培训参考,新手择校避坑指南 - 品牌测评鉴赏家
  • claude 安装配置手册
  • linux系统中简单统计python项目代码行数信息
  • NSCT图像分解实战:用Matlab+NSCT_TOOLBOX处理医学影像(附完整代码)
  • Markdown编辑器
  • 2026化妆培训十大机构盘点!零基础小白择校不踩坑! - 品牌测评鉴赏家
  • Python自动化查询DELL服务器保修信息:从SN号到完整报告(附多线程优化)
  • 2025届毕业生推荐的降AI率工具推荐
  • 别再瞎调参数了!GPT-5的reasoning_effort和verbosity到底怎么设?实战避坑指南