Android 手機資訊存放在mmssms.db資料庫,位于data/data/com.android.providers.telephony/databases下。
短訊息主要用到sms表和threads表。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL5IDO0cjMfJ3UHJzXwATN0ETMvwlMwkDMvwFNxAjMvwVZjFGcz9CXzRWYvxGc19CX0VmbuEmbph2Yz9mLjlGdhR3cvw1LcpDc0RHaiojIsJye.png)
sms表
threads表
sms表和threads表用thread_id互連;
sms表中重要的列位:
- _id sms表自增列,查詢時必須加上
- thread_id 列 對應着threads表
- date 為時間
- body 為短信内容
- address 為電話号碼列
- type 短信類型;接收、發送、草稿箱等 1接收 2發送
threads表中重要的列
- _id對應sms表中thread_id
- data 時間
- message_count 短信的數量
- snippet 短信内容
短信異步查詢簡介
//要查詢的列
private static final String[] CONVERSATION_PROJECTION = new String[]{
"sms.thread_id AS _id",
"groups.msg_count AS msg_count",
"sms.body AS snippet",
"sms.address AS address",
"sms.date AS date"
};
//對應查詢列的位置
private static final int ID_COLUMN_INDEX = 0;
private static final int MSG_COUNT_COLUMN_INDEX = 1;
private static final int SNIPPET_COLUMN_INDEX = 2;
private static final int ADDRESS_COLUMN_INDEX = 3;
private static final int DATE_COLUMN_INDEX = 4;
//查詢
Uri uri = Uri.parse("content://sms/conversations");
queryHandler.startQuery(0, null, uri, CONVERSATION_PROJECTION, null, null, " date DESC"); //異步查詢
等同于
Cursor cursor = cr.query(uri,CONVERSATION_PROJECTION, null, null, null, null, " date DESC", null);
從uri表中查找出CONVERSATION_PROJECTION列,然後按照資料遞減方式排序
//獲得查詢的資料
String idStr = cursor.getString(ID_COLUMN_INDEX); //獲得ID_COLUMN_INDEX列的值 即thread_id
int msg_count = cursor.getInt(MSG_COUNT_COLUMN_INDEX); //獲得 msg_count
String body = cursor.getString(SNIPPET_COLUMN_INDEX); //獲得 snippet
long date = cursor.getLong(DATE_COLUMN_INDEX); //獲得 date
String address = cursor.getString(ADDRESS_COLUMN_INDEX); //獲得 address
短信删除
Uri url = Uri.withAppendedPath(Sms.CONVERSATION_URI, thread_id);
withAppendedPath()傳回指定行号 即_id 的uri
getContentResolver().delete(url, null, null);
查詢号碼通訊錄中是否有記錄,有就查詢名字
建立一個uri 在通訊錄中找到 電話号碼對應的行 并傳回uri
String contactName = null;
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
Cursor contactCursor = getContentResolver().query(uri, CONTACT_PROJECTION, null, null, null);
if(contactCursor.moveToFirst()){
contactName = contactCursor.getString(DISPLAY_NAME_COLUMN_INDEX);
}
contactCursor.close();
private static final String[] CONTACT_PROJECTION = new String[] {
ContactsContract.Contacts._ID, //這個表 不加_id也可以,加了也不錯,為了統一加了
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME //電話中 姓名
};
private static final int DISPLAY_NAME_COLUMN_INDEX = 1; //姓名
同步查詢 //這種方式容易讓程式等待時間過長,是以 不采用
Cursor cursor = db.rawQuery(“select * from person”, null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //擷取第一列的值,第一列的索引從0開始
String name = cursor.getString(1);//擷取第二列的值
int age = cursor.getInt(2);//擷取第三列的值
}
cursor.close();
db.close();
查詢短信類型
private static final String[] SMS_PROJECTION = new String[]{
"_id", //表的 id
"address", //電話号碼
"date", //時間
"type", //短信類型
"body" //内容
};
String selection = " thread_id = ?";
String[] selectionArgs = new String[]{thread_id}; //上面的id
queryHandler.startQuery(0, null, Uri.parse("content://sms"), SMS_PROJECTION, selection, selectionArgs , " date DESC");
資料庫查詢函數
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs,
String groupBy, String having, String orderBy, String limit)
String table = "Orders" ; //表
String[] columns = new String[] { "CustomerName" , "OrderPrice" }; //查詢列
String selection = "Orderdate>?" ; //選擇條件
String[] selectionArgs = new String[]{ "2012" }; //選擇條件
String groupBy = "CustomerName" ; //組名
String having = "SUM(OrderPrice)>500" ;
String orderBy = "CustomerName" ;
Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, " OrderPrice DESC");
等同于下面sql語句
SELECT CustomerName, OrderPrice FROM Orders WHERE Orderdate>2012 GROUP BY CustomerName HAVING
OrderPrice>500 ORDER BY OrderPrice DESC
從Orders表中查詢 CustomerName, OrderPrice 條件 Orderdate>2012 以 CustomerName 并且 OrderPrice>500 進行分組 最後 OrderPrice 遞減方式進行排序
版權聲明:本文為CSDN部落客「weixin_34405925」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34405925/article/details/91999982