|
说明本文是作者Lefe所创,转载请注明出处,如果你在阅读的时候发现问题欢迎一起讨论。本文会不断更新。正文微信绝对是在IM领域的领军人物,无论是从性能还是用户体验方面,它都是非常棒的。所以作者打算拆一拆微信的包...
说明本文是作者Lefe所创,转载请注明出处,如果你在阅读的时候发现问题欢迎一起讨论。本文会不断更新。 正文微信绝对是在IM领域的领军人物,无论是从性能还是用户体验方面,它都是非常棒的。所以作者打算拆一拆微信的包,一探究竟。本文主要从数据库方面来聊一聊微信数据库的设计,也许有不对的地方,希望读者可以指出。微信的数据库中主要记录了消息,好友,漂流瓶,表情的数据,至于朋友圈这种数据, 一、如何获取微信的数据库- 1.手机连接到iTunes,把手机的数据加密备份,记得要记住密码,数据恢复的时候会用到,然后点击立即备份,等待备份完成。
屏幕快照 2017-03-12 上午9.59.36.png- 2.把刚才备份的数据导出,Lefe使用的是 iPhone Backup Extractor,使用免费版的就可以,不过有10秒的广告和每次只能导出4个文件的限制。下载后直接安装,用USB连接到手机,打开 iPhone Backup Extractor。将会显示:
屏幕快照 2017-03-12 上午10.11.08.png输入密码后点击,【Check】,点击后耐心等待,时间比较长。 - 3.找到微信的包,在目录Application Domains/com.tencent.xin/{UUID}/DB/MM.sqlite下,直接将MM.sqlite导出即可。
屏幕快照 2017-03-12 上午10.36.20.png二、分析数据库 数据库.png- 3.通过观察数据库可以发现,微信会根据每一个会话创建一张表。
Chat_006ea3832f24de6e294058a8046a7041,这是一张聊天表,006ea3832f24de6e294058a8046a7041应该是根据某一规则生成的一个会话ID,来唯一标记一个会话。这张表中记录了与某一个人或者某个群的聊天信息。如果有对方消息,将会生成另外一张表ChatExt2_006ea3832f24de6e294058a8046a7041,这张表中仅记录了对方的聊天记录。具体记录如下:Chat_006ea3832f24de6e294058a8046a7041 表中的数据:
屏幕快照 2017-03-12 上午10.45.58.png字段说明:CREATE TABLE Chat_006ea3832f24de6e294058a8046a7041 ( TableVer INTEGER DEFAULT 1, // 表的版本,应该是数据表升级使用 MesLocalID INTEGER PRIMARY KEY AUTOINCREMENT, // 本地消息ID,是主键,这里会有与沙盒中的数据有关联 MesSvrID BIGINT DEFAULT 0, // 服务端的消息ID CreateTime INTEGER DEFAULT 0, // 创建时间 Message TEXT, // 具体消息内容,这里可以是普通字符串,也可以是XML文件,具体不知道微信使用XML文件有什么好处 Status INTEGER DEFAULT 0, // 消息状态,比如发送失败,成功,正在发送 ImgStatus INTEGER DEFAULT 0, // 图片的状态 Type INTEGER, // 消息类型 Des INTEGER // 是否为自己发的消息 );ChatExt2_006ea3832f24de6e294058a8046a7041表中数据 屏幕快照 2017-03-12 上午10.52.51.png这张表中的数据不知道具体做什么业务逻辑,不过估计是和服务端的一个交互,它仅仅和发消息有关。 - 4.索引,如果想提高查询速度,创建索引是必不可少的,微信消息表中的索引主要有:
屏幕快照 2017-03-12 上午11.45.57.png三、对于不确定字段的消息使用XML不知道微信出于何种目的使用XML来存储消息而不是用Json。这是一条语音消息的XML,主要记录与语音相关的一些数据。<msg> <voicemsg endflag="1" length="5191" voicelength="2765" clientmsgid="413732333061346137623033623761000210050311171040be667d4103" fromusername="wxid_hhu2ojejexmy22" downcount="0" cancelflag="0" voiceformat="4" forwardflag="0" bufid="435693659307967035"/> </msg> 四、沙盒与数据库的关系关键点就是ID:006ea3832f24de6e294058a8046a7041和MesLocalID,寻找沙盒中的文件会根据这两个ID来找到对应的资源文件,比如音频和视频。这样可以很方便的找到某一条消息对应的资源。 屏幕快照 2017-03-12 上午11.06.10.png五、好友表CREATE TABLE Friend ( TableVer INTEGER DEFAULT 1, // 表的版本 UsrName TEXT NOT NULL PRIMARY KEY ON CONFLICT REPLACE,// 用户名,唯一 NickName TEXT, // 昵称 Uin INTEGER DEFAULT 0, Email TEXT, Mobile TEXT, Sex INTEGER DEFAULT 0, FullPY TEXT, ShortPY BLOB, Img TEXT, Type INTEGER DEFAULT 0, LastChatTime INTEGER DEFAULT 0, // 最后聊天时间 Draft TEXT // 草稿 );这里主要说明一下:PRIMARY KEY ON CONFLICT REPLACE,这句话的意思是说如果冲突了,就替换的。
六、总结 (编辑:无忧刷机网 - 51刷机网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|