先来看看Mms相关表格
pdu :存储彩信的基本信息,一条mms在pdu表中由一条数据项表示
addr:关于收件人的表,群发彩信时收件人地址就存在这里
part:彩信的每个媒体文件(比如彩信有多少个音频,图片或视频)
drm: 彩信中媒体文件权限信息
rate:传送速度相关的信息
MMS/SMS相关表格关系
threads _id主键;recipient_ids关联cannoical_address的_id;
sms _id主键;thread_id关联thread表的_id;person关联Contact中的id;
pdu _id主键;thread_id关联thread表的_id;
part _id主键;mid关联pdu表的_id;
addr _id主键;msg_id关联pdu表的_id;contact_id关联Contact中的id;
cannoical_address表与addr都是联系人相关表格,区别在于cannoical_address作用是用来为threads提供支持,不同的address对应不同的threads;而addr表是用来为Mms提供支持的,包括Mms中BCC、CC,FROM,TO的相关联系人都在这里;
private void createMmsTables(SQLiteDatabase db) {
// N.B.: Whenever the columns here are changed, the columns in
// {@ref MmsSmsProvider} must be changed to match.
db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PDU + " (" +
Mms._ID + " INTEGER PRIMARY KEY," +
Mms.THREAD_ID + " INTEGER," +
Mms.DATE + " INTEGER," +
Mms.DATE_SENT + " INTEGER DEFAULT 0," +
Mms.MESSAGE_BOX + " INTEGER," +
Mms.READ + " INTEGER DEFAULT 0," +
Mms.MESSAGE_ID + " TEXT," +
Mms.SUBJECT + " TEXT," +
Mms.SUBJECT_CHARSET + " INTEGER," +
Mms.CONTENT_TYPE + " TEXT," +
Mms.CONTENT_LOCATION + " TEXT," +
Mms.EXPIRY + " INTEGER," +
Mms.MESSAGE_CLASS + " TEXT," +
Mms.MESSAGE_TYPE + " INTEGER," +
Mms.MMS_VERSION + " INTEGER," +
Mms.MESSAGE_SIZE + " INTEGER," +
Mms.PRIORITY + " INTEGER," +
Mms.READ_REPORT + " INTEGER," +
Mms.REPORT_ALLOWED + " INTEGER," +
Mms.RESPONSE_STATUS + " INTEGER," +
Mms.STATUS + " INTEGER," +
Mms.TRANSACTION_ID + " TEXT," +
Mms.RETRIEVE_STATUS + " INTEGER," +
Mms.RETRIEVE_TEXT + " TEXT," +
Mms.RETRIEVE_TEXT_CHARSET + " INTEGER," +
Mms.READ_STATUS + " INTEGER," +
Mms.CONTENT_CLASS + " INTEGER," +
Mms.RESPONSE_TEXT + " TEXT," +
Mms.DELIVERY_TIME + " INTEGER," +
Mms.DELIVERY_REPORT + " INTEGER," +
Mms.LOCKED + " INTEGER DEFAULT 0," +
Mms.SEEN + " INTEGER DEFAULT 0" +
");");
db.execSQL("CREATE TABLE " + MmsProvider.TABLE_ADDR + " (" +
Addr._ID + " INTEGER PRIMARY KEY," +
Addr.MSG_ID + " INTEGER," +
Addr.CONTACT_ID + " INTEGER," +
Addr.ADDRESS + " TEXT," +
Addr.TYPE + " INTEGER," +
Addr.CHARSET + " INTEGER);");
db.execSQL("CREATE TABLE " + MmsProvider.TABLE_PART + " (" +
Part._ID + " INTEGER PRIMARY KEY," +
Part.MSG_ID + " INTEGER," +
Part.SEQ + " INTEGER DEFAULT 0," +
Part.CONTENT_TYPE + " TEXT," +
Part.NAME + " TEXT," +
Part.CHARSET + " INTEGER," +
Part.CONTENT_DISPOSITION + " TEXT," +
Part.FILENAME + " TEXT," +
Part.CONTENT_ID + " TEXT," +
Part.CONTENT_LOCATION + " TEXT," +
Part.CT_START + " INTEGER," +
Part.CT_TYPE + " TEXT," +
Part._DATA + " TEXT," +
Part.TEXT + " TEXT);");
db.execSQL("CREATE TABLE " + MmsProvider.TABLE_RATE + " (" +
Rate.SENT_TIME + " INTEGER);");
db.execSQL("CREATE TABLE " + MmsProvider.TABLE_DRM + " (" +
BaseColumns._ID + " INTEGER PRIMARY KEY," +
"_data TEXT);");
}
数据项的意义,可以参考android.provider.Telephony
/**
* Base columns for tables that contain MMSs.
*/
public interface BaseMmsColumns extends BaseColumns {
public static final int MESSAGE_BOX_ALL = 0;
public static final int MESSAGE_BOX_INBOX = 1;
public static final int MESSAGE_BOX_SENT = 2;
public static final int MESSAGE_BOX_DRAFTS = 3;
public static final int MESSAGE_BOX_OUTBOX = 4;
/**
* The date the message was received.
* <P>Type: INTEGER (long)</P>
*/
public static final String DATE = "date";
/**
* The date the message was sent.
* <P>Type: INTEGER (long)</P>
*/
public static final String DATE_SENT = "date_sent";
/**
* The box which the message belong to, for example, MESSAGE_BOX_INBOX.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_BOX = "msg_box";
/**
* Has the message been read.
* <P>Type: INTEGER (boolean)</P>
*/
public static final String READ = "read";
/**
* Indicates whether this message has been seen by the user. The "seen" flag will be
* used to figure out whether we need to throw up a statusbar notification or not.
*/
public static final String SEEN = "seen";
/**
* The Message-ID of the message.
* <P>Type: TEXT</P>
*/
public static final String MESSAGE_ID = "m_id";
/**
* The subject of the message, if present.
* <P>Type: TEXT</P>
*/
public static final String SUBJECT = "sub";
/**
* The character set of the subject, if present.
* <P>Type: INTEGER</P>
*/
public static final String SUBJECT_CHARSET = "sub_cs";
/**
* The Content-Type of the message.
* <P>Type: TEXT</P>
*/
public static final String CONTENT_TYPE = "ct_t";
/**
* The Content-Location of the message.
* <P>Type: TEXT</P>
*/
public static final String CONTENT_LOCATION = "ct_l";
/**
* The address of the sender.
* <P>Type: TEXT</P>
*/
public static final String FROM = "from";
/**
* The address of the recipients.
* <P>Type: TEXT</P>
*/
public static final String TO = "to";
/**
* The address of the cc. recipients.
* <P>Type: TEXT</P>
*/
public static final String CC = "cc";
/**
* The address of the bcc. recipients.
* <P>Type: TEXT</P>
*/
public static final String BCC = "bcc";
/**
* The expiry time of the message.
* <P>Type: INTEGER</P>
*/
public static final String EXPIRY = "exp";
/**
* The class of the message.
* <P>Type: TEXT</P>
*/
public static final String MESSAGE_CLASS = "m_cls";
/**
* The type of the message defined by MMS spec.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_TYPE = "m_type";
/**
* The version of specification that this message conform.
* <P>Type: INTEGER</P>
*/
public static final String MMS_VERSION = "v";
/**
* The size of the message.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_SIZE = "m_size";
/**
* The priority of the message.
* <P>Type: TEXT</P>
*/
public static final String PRIORITY = "pri";
/**
* The read-report of the message.
* <P>Type: TEXT</P>
*/
public static final String READ_REPORT = "rr";
/**
* Whether the report is allowed.
* <P>Type: TEXT</P>
*/
public static final String REPORT_ALLOWED = "rpt_a";
/**
* The response-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String RESPONSE_STATUS = "resp_st";
/**
* The status of the message.
* <P>Type: INTEGER</P>
*/
public static final String STATUS = "st";
/**
* The transaction-id of the message.
* <P>Type: TEXT</P>
*/
public static final String TRANSACTION_ID = "tr_id";
/**
* The retrieve-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String RETRIEVE_STATUS = "retr_st";
/**
* The retrieve-text of the message.
* <P>Type: TEXT</P>
*/
public static final String RETRIEVE_TEXT = "retr_txt";
/**
* The character set of the retrieve-text.
* <P>Type: TEXT</P>
*/
public static final String RETRIEVE_TEXT_CHARSET = "retr_txt_cs";
/**
* The read-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String READ_STATUS = "read_status";
/**
* The content-class of the message.
* <P>Type: INTEGER</P>
*/
public static final String CONTENT_CLASS = "ct_cls";
/**
* The delivery-report of the message.
* <P>Type: INTEGER</P>
*/
public static final String DELIVERY_REPORT = "d_rpt";
/**
* The delivery-time-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String DELIVERY_TIME_TOKEN = "d_tm_tok";
/**
* The delivery-time of the message.
* <P>Type: INTEGER</P>
*/
public static final String DELIVERY_TIME = "d_tm";
/**
* The response-text of the message.
* <P>Type: TEXT</P>
*/
public static final String RESPONSE_TEXT = "resp_txt";
/**
* The sender-visibility of the message.
* <P>Type: TEXT</P>
*/
public static final String SENDER_VISIBILITY = "s_vis";
/**
* The reply-charging of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING = "r_chg";
/**
* The reply-charging-deadline-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING_DEADLINE_TOKEN = "r_chg_dl_tok";
/**
* The reply-charging-deadline of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING_DEADLINE = "r_chg_dl";
/**
* The reply-charging-id of the message.
* <P>Type: TEXT</P>
*/
public static final String REPLY_CHARGING_ID = "r_chg_id";
/**
* The reply-charging-size of the message.
* <P>Type: INTEGER</P>
*/
public static final String REPLY_CHARGING_SIZE = "r_chg_sz";
/**
* The previously-sent-by of the message.
* <P>Type: TEXT</P>
*/
public static final String PREVIOUSLY_SENT_BY = "p_s_by";
/**
* The previously-sent-date of the message.
* <P>Type: INTEGER</P>
*/
public static final String PREVIOUSLY_SENT_DATE = "p_s_d";
/**
* The store of the message.
* <P>Type: TEXT</P>
*/
public static final String STORE = "store";
/**
* The mm-state of the message.
* <P>Type: INTEGER</P>
*/
public static final String MM_STATE = "mm_st";
/**
* The mm-flags-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String MM_FLAGS_TOKEN = "mm_flg_tok";
/**
* The mm-flags of the message.
* <P>Type: TEXT</P>
*/
public static final String MM_FLAGS = "mm_flg";
/**
* The store-status of the message.
* <P>Type: TEXT</P>
*/
public static final String STORE_STATUS = "store_st";
/**
* The store-status-text of the message.
* <P>Type: TEXT</P>
*/
public static final String STORE_STATUS_TEXT = "store_st_txt";
/**
* The stored of the message.
* <P>Type: TEXT</P>
*/
public static final String STORED = "stored";
/**
* The totals of the message.
* <P>Type: TEXT</P>
*/
public static final String TOTALS = "totals";
/**
* The mbox-totals of the message.
* <P>Type: TEXT</P>
*/
public static final String MBOX_TOTALS = "mb_t";
/**
* The mbox-totals-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String MBOX_TOTALS_TOKEN = "mb_t_tok";
/**
* The quotas of the message.
* <P>Type: TEXT</P>
*/
public static final String QUOTAS = "qt";
/**
* The mbox-quotas of the message.
* <P>Type: TEXT</P>
*/
public static final String MBOX_QUOTAS = "mb_qt";
/**
* The mbox-quotas-token of the message.
* <P>Type: INTEGER</P>
*/
public static final String MBOX_QUOTAS_TOKEN = "mb_qt_tok";
/**
* The message-count of the message.
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_COUNT = "m_cnt";
/**
* The start of the message.
* <P>Type: INTEGER</P>
*/
public static final String START = "start";
/**
* The distribution-indicator of the message.
* <P>Type: TEXT</P>
*/
public static final String DISTRIBUTION_INDICATOR = "d_ind";
/**
* The element-descriptor of the message.
* <P>Type: TEXT</P>
*/
public static final String ELEMENT_DESCRIPTOR = "e_des";
/**
* The limit of the message.
* <P>Type: INTEGER</P>
*/
public static final String LIMIT = "limit";
/**
* The recommended-retrieval-mode of the message.
* <P>Type: INTEGER</P>
*/
public static final String RECOMMENDED_RETRIEVAL_MODE = "r_r_mod";
/**
* The recommended-retrieval-mode-text of the message.
* <P>Type: TEXT</P>
*/
public static final String RECOMMENDED_RETRIEVAL_MODE_TEXT = "r_r_mod_txt";
/**
* The status-text of the message.
* <P>Type: TEXT</P>
*/
public static final String STATUS_TEXT = "st_txt";
/**
* The applic-id of the message.
* <P>Type: TEXT</P>
*/
public static final String APPLIC_ID = "apl_id";
/**
* The reply-applic-id of the message.
* <P>Type: TEXT</P>
*/
public static final String REPLY_APPLIC_ID = "r_apl_id";
/**
* The aux-applic-id of the message.
* <P>Type: TEXT</P>
*/
public static final String AUX_APPLIC_ID = "aux_apl_id";
/**
* The drm-content of the message.
* <P>Type: TEXT</P>
*/
public static final String DRM_CONTENT = "drm_c";
/**
* The adaptation-allowed of the message.
* <P>Type: TEXT</P>
*/
public static final String ADAPTATION_ALLOWED = "adp_a";
/**
* The replace-id of the message.
* <P>Type: TEXT</P>
*/
public static final String REPLACE_ID = "repl_id";
/**
* The cancel-id of the message.
* <P>Type: TEXT</P>
*/
public static final String CANCEL_ID = "cl_id";
/**
* The cancel-status of the message.
* <P>Type: INTEGER</P>
*/
public static final String CANCEL_STATUS = "cl_st";
/**
* The thread ID of the message
* <P>Type: INTEGER</P>
*/
public static final String THREAD_ID = "thread_id";
/**
* Has the message been locked?
* <P>Type: INTEGER (boolean)</P>
*/
public static final String LOCKED = "locked";
/**
* Meta data used externally.
* <P>Type: TEXT</P>
*/
public static final String META_DATA = "meta_data";
}
另外还创建了一些用来组织conversation需要用到的表,thread表的主键是由与之联系的address来决定的,这样来保证和同一人的交流被组织成一个conversation(thread)。
private void createCommonTables(SQLiteDatabase db) {
// TODO Ensure that each entry is removed when the last use of
// any address equivalent to its address is removed.
/**
* This table maps the first instance seen of any particular
* MMS/SMS address to an ID, which is then used as its
* canonical representation. If the same address or an
* equivalent address (as determined by our Sqlite
* PHONE_NUMBERS_EQUAL extension) is seen later, this same ID
* will be used. The _id is created with AUTOINCREMENT so it
* will never be reused again if a recipient is deleted.
*/
db.execSQL("CREATE TABLE canonical_addresses (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"address TEXT);");
/**
* This table maps the subject and an ordered set of recipient
* IDs, separated by spaces, to a unique thread ID. The IDs
* come from the canonical_addresses table. This works
* because messages are considered to be part of the same
* thread if they have the same subject (or a null subject)
* and the same set of recipients.
*/
db.execSQL("CREATE TABLE threads (" +
Threads._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
Threads.DATE + " INTEGER DEFAULT 0," +
Threads.MESSAGE_COUNT + " INTEGER DEFAULT 0," +
Threads.RECIPIENT_IDS + " TEXT," +
Threads.SNIPPET + " TEXT," +
Threads.SNIPPET_CHARSET + " INTEGER DEFAULT 0," +
Threads.READ + " INTEGER DEFAULT 1," +
Threads.TYPE + " INTEGER DEFAULT 0," +
Threads.ERROR + " INTEGER DEFAULT 0," +
Threads.HAS_ATTACHMENT + " INTEGER DEFAULT 0);");
/**
* This table stores the queue of messages to be sent/downloaded.
*/
db.execSQL("CREATE TABLE " + MmsSmsProvider.TABLE_PENDING_MSG +" (" +
PendingMessages._ID + " INTEGER PRIMARY KEY," +
PendingMessages.PROTO_TYPE + " INTEGER," +
PendingMessages.MSG_ID + " INTEGER," +
PendingMessages.MSG_TYPE + " INTEGER," +
PendingMessages.ERROR_TYPE + " INTEGER," +
PendingMessages.ERROR_CODE + " INTEGER," +
PendingMessages.RETRY_INDEX + " INTEGER NOT NULL DEFAULT 0," +
PendingMessages.DUE_TIME + " INTEGER," +
PendingMessages.LAST_TRY + " INTEGER);");
}
1)canonical_addresses: canonical_addresses 和联系人有关的表 在threads表的recipient_ids字段对应此表的id,但是这个id并不是Contacts应用里面的id
2)threads:该表非常重要存储的是会话相关的内容,一个会话表示的是你和某人的交流记录
3)pending_msgs:该表存储的是已发送的彩信和待下载的彩信