android Mms 数据库5

2024-03-31 09:38
文章标签 android 数据库 mms

本文主要是介绍android Mms 数据库5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mms数据库的triggers


1. threads表将SMS、MMS的信息组织成一个conversation,所以当MMS、SMS信息发生改变时也需要更新threads表

2. 维护pending_msgs表格,其中包含pending_msgs表用于存储待发送或下载的SMS/MMS

3. 维护错误标志位

    /*** the name of the table that is used to store the queue of* messages(both MMS and SMS) to be sent/downloaded.*/public static final String TABLE_PENDING_MSG = "pending_msgs";

    private void createCommonTriggers(SQLiteDatabase db) {// Updates threads table whenever a message is added to pdu.db.execSQL("CREATE TRIGGER pdu_update_thread_on_insert AFTER INSERT ON " +MmsProvider.TABLE_PDU + " " +PDU_UPDATE_THREAD_CONSTRAINTS +PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);// Updates threads table whenever a message is added to sms.db.execSQL("CREATE TRIGGER sms_update_thread_on_insert AFTER INSERT ON sms " +SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);// Updates threads table whenever a message in pdu is updated.db.execSQL("CREATE TRIGGER pdu_update_thread_date_subject_on_update AFTER" +"  UPDATE OF " + Mms.DATE + ", " + Mms.SUBJECT + ", " + Mms.MESSAGE_BOX +"  ON " + MmsProvider.TABLE_PDU + " " +PDU_UPDATE_THREAD_CONSTRAINTS +PDU_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);// Updates threads table whenever a message in sms is updated.db.execSQL("CREATE TRIGGER sms_update_thread_date_subject_on_update AFTER" +"  UPDATE OF " + Sms.DATE + ", " + Sms.BODY + ", " + Sms.TYPE +"  ON sms " +SMS_UPDATE_THREAD_DATE_SNIPPET_COUNT_ON_UPDATE);// Updates threads table whenever a message in pdu is updated.db.execSQL("CREATE TRIGGER pdu_update_thread_read_on_update AFTER" +"  UPDATE OF " + Mms.READ +"  ON " + MmsProvider.TABLE_PDU + " " +PDU_UPDATE_THREAD_CONSTRAINTS +"BEGIN " +PDU_UPDATE_THREAD_READ_BODY +"END;");// Updates threads table whenever a message in sms is updated.db.execSQL("CREATE TRIGGER sms_update_thread_read_on_update AFTER" +"  UPDATE OF " + Sms.READ +"  ON sms " +"BEGIN " +SMS_UPDATE_THREAD_READ_BODY +"END;");// Update threads table whenever a message in pdu is deleteddb.execSQL("CREATE TRIGGER pdu_update_thread_on_delete " +"AFTER DELETE ON pdu " +"BEGIN " +"  UPDATE threads SET " +"     date = (strftime('%s','now') * 1000)" +"  WHERE threads._id = old." + Mms.THREAD_ID + "; " +UPDATE_THREAD_COUNT_ON_OLD +UPDATE_THREAD_SNIPPET_SNIPPET_CS_ON_DELETE +"END;");// As of DATABASE_VERSION 55, we've removed these triggers that delete empty threads.// These triggers interfere with saving drafts on brand new threads. Instead of// triggers cleaning up empty threads, the empty threads should be cleaned up by// an explicit call to delete with Threads.OBSOLETE_THREADS_URI.//        // When the last message in a thread is deleted, these
//        // triggers ensure that the entry for its thread ID is removed
//        // from the threads table.
//        db.execSQL("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;");
//
//        db.execSQL("CREATE TRIGGER delete_obsolete_threads_when_update_pdu " +
//                   "AFTER UPDATE OF " + Mms.THREAD_ID + " ON pdu " +
//                   "WHEN old." + Mms.THREAD_ID + " != new." + Mms.THREAD_ID + " " +
//                   "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;");// Insert pending status for M-Notification.ind or M-ReadRec.ind// when they are inserted into Inbox/Outbox.db.execSQL("CREATE TRIGGER insert_mms_pending_on_insert " +"AFTER INSERT ON pdu " +"WHEN new." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND +"  OR new." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_READ_REC_IND +" " +"BEGIN " +"  INSERT INTO " + MmsSmsProvider.TABLE_PENDING_MSG +"    (" + PendingMessages.PROTO_TYPE + "," +"     " + PendingMessages.MSG_ID + "," +"     " + PendingMessages.MSG_TYPE + "," +"     " + PendingMessages.ERROR_TYPE + "," +"     " + PendingMessages.ERROR_CODE + "," +"     " + PendingMessages.RETRY_INDEX + "," +"     " + PendingMessages.DUE_TIME + ") " +"  VALUES " +"    (" + MmsSms.MMS_PROTO + "," +"      new." + BaseColumns._ID + "," +"      new." + Mms.MESSAGE_TYPE + ",0,0,0,0);" +"END;");// Insert pending status for M-Send.req when it is moved into Outbox.db.execSQL("CREATE TRIGGER insert_mms_pending_on_update " +"AFTER UPDATE ON pdu " +"WHEN new." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_SEND_REQ +"  AND new." + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_OUTBOX +"  AND old." + Mms.MESSAGE_BOX + "!=" + Mms.MESSAGE_BOX_OUTBOX + " " +"BEGIN " +"  INSERT INTO " + MmsSmsProvider.TABLE_PENDING_MSG +"    (" + PendingMessages.PROTO_TYPE + "," +"     " + PendingMessages.MSG_ID + "," +"     " + PendingMessages.MSG_TYPE + "," +"     " + PendingMessages.ERROR_TYPE + "," +"     " + PendingMessages.ERROR_CODE + "," +"     " + PendingMessages.RETRY_INDEX + "," +"     " + PendingMessages.DUE_TIME + ") " +"  VALUES " +"    (" + MmsSms.MMS_PROTO + "," +"      new." + BaseColumns._ID + "," +"      new." + Mms.MESSAGE_TYPE + ",0,0,0,0);" +"END;");// When a message is moved out of Outbox, delete its pending status.db.execSQL("CREATE TRIGGER delete_mms_pending_on_update " +"AFTER UPDATE ON " + MmsProvider.TABLE_PDU + " " +"WHEN old." + Mms.MESSAGE_BOX + "=" + Mms.MESSAGE_BOX_OUTBOX +"  AND new." + Mms.MESSAGE_BOX + "!=" + Mms.MESSAGE_BOX_OUTBOX + " " +"BEGIN " +"  DELETE FROM " + MmsSmsProvider.TABLE_PENDING_MSG +"  WHERE " + PendingMessages.MSG_ID + "=new._id; " +"END;");// Delete pending status for a message when it is deleted.db.execSQL("CREATE TRIGGER delete_mms_pending_on_delete " +"AFTER DELETE ON " + MmsProvider.TABLE_PDU + " " +"BEGIN " +"  DELETE FROM " + MmsSmsProvider.TABLE_PENDING_MSG +"  WHERE " + PendingMessages.MSG_ID + "=old._id; " +"END;");// TODO Add triggers for SMS retry-status management.// Update the error flag of threads when the error type of// a pending MM is updated.db.execSQL("CREATE TRIGGER update_threads_error_on_update_mms " +"  AFTER UPDATE OF err_type ON pending_msgs " +"  WHEN (OLD.err_type < 10 AND NEW.err_type >= 10)" +"    OR (OLD.err_type >= 10 AND NEW.err_type < 10) " +"BEGIN" +"  UPDATE threads SET error = " +"    CASE" +"      WHEN NEW.err_type >= 10 THEN error + 1" +"      ELSE error - 1" +"    END " +"  WHERE _id =" +"   (SELECT DISTINCT thread_id" +"    FROM pdu" +"    WHERE _id = NEW.msg_id); " +"END;");// Update the error flag of threads when delete pending message.db.execSQL("CREATE TRIGGER update_threads_error_on_delete_mms " +"  BEFORE DELETE ON pdu" +"  WHEN OLD._id IN (SELECT DISTINCT msg_id" +"                   FROM pending_msgs" +"                   WHERE err_type >= 10) " +"BEGIN " +"  UPDATE threads SET error = error - 1" +"  WHERE _id = OLD.thread_id; " +"END;");// Update the error flag of threads while moving an MM out of Outbox,// which was failed to be sent permanently.db.execSQL("CREATE TRIGGER update_threads_error_on_move_mms " +"  BEFORE UPDATE OF msg_box ON pdu " +"  WHEN (OLD.msg_box = 4 AND NEW.msg_box != 4) " +"  AND (OLD._id IN (SELECT DISTINCT msg_id" +"                   FROM pending_msgs" +"                   WHERE err_type >= 10)) " +"BEGIN " +"  UPDATE threads SET error = error - 1" +"  WHERE _id = OLD.thread_id; " +"END;");// Update the error flag of threads after a text message was// failed to send/receive.db.execSQL("CREATE TRIGGER update_threads_error_on_update_sms " +"  AFTER UPDATE OF type ON sms" +"  WHEN (OLD.type != 5 AND NEW.type = 5)" +"    OR (OLD.type = 5 AND NEW.type != 5) " +"BEGIN " +"  UPDATE threads SET error = " +"    CASE" +"      WHEN NEW.type = 5 THEN error + 1" +"      ELSE error - 1" +"    END " +"  WHERE _id = NEW.thread_id; " +"END;");}


4. 特别为Mms设计的triggers

从中可以得知对于Mms delivery report/read report信息是分别作为一条数据项放在pdu表中的。


        // Cleans up parts when a MM is deleted.db.execSQL("CREATE TRIGGER part_cleanup DELETE ON " + MmsProvider.TABLE_PDU + " " +"BEGIN " +"  DELETE FROM " + MmsProvider.TABLE_PART +"  WHERE " + Part.MSG_ID + "=old._id;" +"END;");// Cleans up address info when a MM is deleted.db.execSQL("CREATE TRIGGER addr_cleanup DELETE ON " + MmsProvider.TABLE_PDU + " " +"BEGIN " +"  DELETE FROM " + MmsProvider.TABLE_ADDR +"  WHERE " + Addr.MSG_ID + "=old._id;" +"END;");// Delete obsolete delivery-report, read-report while deleting their// associated Send.req.db.execSQL("CREATE TRIGGER cleanup_delivery_and_read_report " +"AFTER DELETE ON " + MmsProvider.TABLE_PDU + " " +"WHEN old." + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_SEND_REQ + " " +"BEGIN " +"  DELETE FROM " + MmsProvider.TABLE_PDU +"  WHERE (" + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_DELIVERY_IND +"    OR " + Mms.MESSAGE_TYPE + "=" + PduHeaders.MESSAGE_TYPE_READ_ORIG_IND +")" +"    AND " + Mms.MESSAGE_ID + "=old." + Mms.MESSAGE_ID + "; " +"END;");// Update threads table to indicate whether attachments exist when// parts are inserted or deleted.db.execSQL(PART_UPDATE_THREADS_ON_INSERT_TRIGGER);db.execSQL(PART_UPDATE_THREADS_ON_UPDATE_TRIGGER);db.execSQL(PART_UPDATE_THREADS_ON_DELETE_TRIGGER);db.execSQL(PDU_UPDATE_THREADS_ON_UPDATE_TRIGGER);




这篇关于android Mms 数据库5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864024

相关文章

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle