Android源代碼在 彩信sms 表和彩信 pdu表,增加了一個觸發器
- CREATE TRIGGER delete_obsolete_threads_pdu AFTER
- DELETE ON pdu BEGIN
- DELETE FROM threads
- WHERE _id = old.thread_id AND _id NOT IN
- (SELECT thread_id FROM sms UNION SELECT thread_id from pdu);
- END
仔細看下就明白,如果threads表沒有sms和pdu外部引用的時候,這條thread就會被刪除。
thread被刪除後,你再插入一條短信或者彩信(當然是代碼插入),這時候因為沒有thread id,所以就會不顯示。
有人可能想到對threads表一起進行維護不就行了嗎? 很不幸 ,系統對這個表的providers並不完全開放,只能用於查找。
但我們這時候又需要thread_id, 我對源代碼進行了一些修改,把thread類提取了出來,僅供大家參考
- package com.sweetop.provider;
-
- import java.util.HashSet;
- import java.util.Set;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- import android.content.Context;
- import android.database.Cursor;
- import android.net.Uri;
- import android.text.TextUtils;
- import android.util.Log;
- import android.util.Patterns;
-
- public final class Threads implements ThreadsColumns {
- private static final String[] ID_PROJECTION = { BaseColumns._ID };
- private static final String STANDARD_ENCODING = "UTF-8";
- private static final Uri THREAD_ID_CONTENT_URI = Uri
- .parse("content://mms-sms/threadID");
- public static final Uri CONTENT_URI = Uri.withAppendedPath(
- Uri.parse("content://mms-sms/"), "conversations");
- public static final Uri OBSOLETE_THREADS_URI = Uri.withAppendedPath(
- CONTENT_URI, "obsolete");
- public static final Pattern NAME_ADDR_EMAIL_PATTERN = Pattern
- .compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*");
-
- public static final int COMMON_THREAD = 0;
- public static final int BROADCAST_THREAD = 1;
-
- // No one should construct an instance of this class.
- private Threads() {
- }
-
- /**
- * This is a single-recipient version of getOrCreateThreadId. It's
- * convenient for use with SMS messages.
- */
- public static long getOrCreateThreadId(Context context, String recipient) {
- Set<String> recipients = new HashSet<String>();
-
- recipients.add(recipient);
- return getOrCreateThreadId(context, recipients);
- }
-
- /**
- * Given the recipients list and subject of an unsaved message, return its
- * thread ID. If the message starts a new thread, allocate a new thread ID.
- * Otherwise, use the appropriate existing thread ID.
- *
- * Find the thread ID of the same set of recipients (in any order, without
- * any additions). If one is found, return it. Otherwise, return a unique
- * thread ID.
- */
- public static long getOrCreateThreadId(Context context,
- Set<String> recipients) {
- Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon();
-
- for (String recipient : recipients) {
- if (isEmailAddress(recipient)) {
- recipient = extractAddrSpec(recipient);
- }
-
- uriBuilder.appendQueryParameter("recipient", recipient);
- }
-
- Uri uri = uriBuilder.build();
- // if (DEBUG) Log.v(TAG, "getOrCreateThreadId uri: " + uri);
-
- Cursor cursor = context.getContentResolver().query(uri, ID_PROJECTION,
- null, null, null);
- if (true) {
- Log.v("Threads",
- "getOrCreateThreadId cursor cnt: " + cursor.getCount());
- }
- if (cursor != null) {
- try {
- if (cursor.moveToFirst()) {
- return cursor.getLong(0);
- } else {
- Log.e("Threads", "getOrCreateThreadId returned no rows!");
- }
- } finally {
- cursor.close();
- }
- }
-
- Log.e("Threads",
- "getOrCreateThreadId failed with uri " + uri.toString());
- throw new IllegalArgumentException(
- "Unable to find or allocate a thread ID.");
- }
-
- public static String extractAddrSpec(String address) {
- Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address);
-
- if (match.matches()) {
- return match.group(2);
- }
- return address;
- }
-
- /**
- * Returns true if the address is an email address
- *
- * @param address
- * the input address to be tested
- * @return true if address is an email address
- */
- public static boolean isEmailAddress(String address) {
- if (TextUtils.isEmpty(address)) {
- return false;
- }
-
- String s = extractAddrSpec(address);
- Matcher match = Patterns.EMAIL_ADDRESS.matcher(s);
- return match.matches();
- }
- }
當你需要獲得一個thread id時,僅需調用
- Threads.getOrCreateThreadId(this, address)
address是發送方的手機地址