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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma