SmsProvider, MmsProvider, MmsSmsProvider利用MmsSmsDatabaseHelper来操作数据库。

1. MmsSmsDatabaseHelper继承了SQLiteOpenHelper。

public class MmsSmsDatabaseHelper extends SQLiteOpenHelper

它至少需要实现三个方法:构造方法、onCreate方法、onUpdate方法。

2. 实现私有构造方法。

private MmsSmsDatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

    mContext = context;
}

3. 通过getInstance()方法获取MmsSmsDatabaseHelper的一个实例。

static synchronized MmsSmsDatabaseHelper getInstance(Context context) {
    if (sInstance == null) {
        sInstance = new MmsSmsDatabaseHelper(context);
    }
    return sInstance;
}

4. 在onCreate()方法中创建数据库表、触发器、索引。

@Override
public void onCreate(SQLiteDatabase db) {
    createMmsTables(db);
    createSmsTables(db);
    createCommonTables(db);
    createCommonTriggers(db);
    createMmsTriggers(db);
    createWordsTables(db);
    createIndices(db);
}

5. 实现了onUpgrade()方法。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion)

6. 在createCommonTables(db)方法中

(1)创建表threads表。

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);");

(2)创建canonical_addresses表。

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);");

(3)创建sms表。

字段status解析:a TP-Status value or -1 if it status hasn't been received。

db.execSQL("CREATE TABLE sms (" +
           "_id INTEGER PRIMARY KEY," +
           "thread_id INTEGER," +
           "address TEXT," +
           "person INTEGER," +
           "date INTEGER," +
           "date_sent INTEGER DEFAULT 0," +
           "protocol INTEGER," +
           "read INTEGER DEFAULT 0," +
           "status INTEGER DEFAULT -1," + 
           "type INTEGER," +
           "reply_path_present INTEGER," +
           "subject TEXT," +
           "body TEXT," +
           "service_center TEXT," +
           "locked INTEGER DEFAULT 0," +
           "error_code INTEGER DEFAULT 0," +
           "seen INTEGER DEFAULT 0" +
           ");");

com.android.providers.telephony.MmsSmsDatabaseHelper的更多相关文章

  1. Android 使用Telephony API

    Android 使用Telephony API public class TelephonyDemo extends Activity { TextView textOut; TelephonyMan ...

  2. 真机无法接收到android.provider.Telephony.SMS_RECEIVED的问题

    小米2S有一个设定会导致,App无法接收到android.provider.Telephony.SMS_RECEIVED广播. 解决方案 关闭系统短信优先设置 短信-设置-高级设置-系统短信优先   ...

  3. import android.provider.Telephony cannot be resolved

    android.provider.Telephony is hidden. http://androidxref.com/4.0.3_r1/xref/frameworks/base/core/java ...

  4. Android -- com.android.providers.media,external.db

    external.db android是管理多媒体文件(音频.视频.图片)的信息是在/data/data/com.android.providers.media下的数据库文件external.db. ...

  5. java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/20 from pid=711, uid=10074 requires android.permission.READ_

    java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider ur ...

  6. 接收新信息,在会话中看不到(thread表数据插入/更新失败)

    分析原因:收到短信,sms表插入信息,触发器会自动更新thread表,更新失败导致一直有一条未读信息数量显示,但在会话列表中却看不到. (偶现,低概率. 解决方法:接收新信息插入后,立即查询threa ...

  7. android 管理手机短信

    为了看代码方便,一边在网上google资料,一边看Android java 源代码. 偶然发现了一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mm ...

  8. (转)[Android实例] 关于使用ContentObserver监听不到删除短信会话的解决方案

    最近做通讯录的项目,需要实时监听短信的删除,就用到了观察者ContentObserver,怪异的事情就此发生,当我删除一条短信的时候,可以监听到,但是,当我删除整条短信的时候,就无法监听到,查了很多资 ...

  9. android 中管理短信

    为了看代码方便,一边在网上google资料,一边看Android java 源代码. 偶然发现了一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mm ...

随机推荐

  1. QT国际化(中英转换)

    转载:https://blog.csdn.net/u012528526/article/details/54707233 QT国际化(中英转换) 我们都知道在安卓中,想做国际化很简单,只需要建立对应的 ...

  2. Binary Tree Maximum Path Sum leetcode java

    题目: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tr ...

  3. 热修复 DexPosed AOP Xposed MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 前端性能优化:配置ETag

    什么是ETag? 实体标签(EntityTag)是唯一标识了一个组件的一个特定版本的字符串,是web服务器用于确认缓存组件的有效性的一种机制,通常可以使用组件的某些属性来构造它. 条件GET请求 浏览 ...

  5. docker service ps打印出来的错误信息被截断了怎么办?

      [解决方法] 用Format属性: 这个其实解决不了截断的问题,不过可以显示更少的列,看起来更清楚. Formatting The formatting options (--format) pr ...

  6. cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...

  7. create-react-app时registry的奇怪问题

    用React官方给的NPM脚本 create-react-app my-app 在自动安装module的过程中,在安装registry的组件的时候莫名其妙的挂住不动了.界面显示的信息如下: fetch ...

  8. 启动IntelliJ IDEA 2016报错:cannot start under Java 1.7 : Java 1.8 or later is required 解决办法

    idea64.exe启动错误:Cannot start under Java 1.7.0xxx IntelliJ IDEA : Unsupported java version Cannot star ...

  9. 安装ecshop2.7时候的错误处理 php版本不兼容引起

    装ECShop2.7.3出现了一堆问题,主要是因为PHP版本过高引起的,不愿意降低版本,则只能一个个解决啦!这些问题包括:preg_replace.cls_image::gd_version.end( ...

  10. angular.element()的用法

    1.引用jQuery的前提下,和$用法基本相同:angular.element('#').html() 例如: angular.element('#test').html() angular.elem ...