欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Mms之:对话与联系人关联的总结详解

程序员文章站 2023-11-20 18:23:34
在mms中每个thread都有其相应的联系人,但是threads表中并没有直接保存联系人的信息(号码或名字),而是保存一个叫做recipient_id的东西,也还有一个类叫...

在mms中每个thread都有其相应的联系人,但是threads表中并没有直接保存联系人的信息(号码或名字),而是保存一个叫做recipient_id的东西,也还有一个类叫做data/recipientidcache.java专门管理它。

在数据库中专门有一个表来保存它canonical_addresses。它的目的就是为了能够快速的找到某一对话的联系人的信息。对话的表threads里面并没有保存其联系人的直接信息,而是有一列叫做recipient_ids的整数来代表收信人。而在数据库还有另外一个表叫做canonical_addresses,其用来匹配threads中的recipient_ids和号码,其只有二列,一个是_id,另一个就是它的号码。因为对话中并没有直接保存联系人的信息,所以当conversationlist想要显示一个thread时,就要先查到它的recipientid,然后再根据这个recipientid到canonical_addresses中查找到号码,再用这个号码去联系人数据库查询到联系人的其他信息。这一整个过程比较烦琐,需要要查询三次数据库才能得到联系人的信息,就无法快速的显示出来。所以就有了recipientidcache这个类,这个类内部有一个hash表,键是threadrecipientid,值是联系人的号码。其他的类,比如conversation在查询thread的时候不会直接去查询canonical_addresses表来得到对应recipientid的联系人的号码,而是直接通过recipientidcache来获取。recipientidcache先从自己的cache中来查到号码,如果查找 不到再去查询数据库,并加到cache中。每次发送信息时都会进行一次更新cache的动作。因为recipientidthread中的一个属性,所以当thread表发生变化时,比如删除一个thread时也都会进行更新recipientidcache