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 recipients = new HashSet();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 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是发送方的手机地址


如有问题,可以再评论中说明,我会一一回复。


另,转载注明出处


如果我的文章对您有帮助,请用支付宝打赏:



更多相关文章

  1. Android应用程序安装过程源代码分析(3)
  2. Ubuntu 13.04 编译环境配置及android 2.3 源代码编译时出现了以
  3. 45个android实例源码
  4. Android应用程序安装过程源代码分析(4)
  5. Android(安卓)之经典源码
  6. Android(安卓)ViewHolder 优化 ListView
  7. [置顶] Android(安卓)2.3.5源代码 更新至android 6.0,可以下载,度
  8. Android开发小知识文章目录
  9. Android(安卓)Launcher一些资源

随机推荐

  1. Android(安卓)复制单个文件到指定目录,And
  2. android 获取包名的两种方式
  3. 提升基于英特尔® 架构的 Android* 模拟
  4. android应用程序设置全屏
  5. [置顶] Android学习进阶路线导航线路(And
  6. Android中贪吃蛇游戏的学习(四)
  7. [置顶] Android开发之ScrollView去掉右侧
  8. 2011.07.18——— android AlphaBitmap
  9. android apk的安装
  10. Android(安卓)studio 启动出现错误AAPT: