ContentResolver.query()—>buildQueryString()
Cursor cursor = context.getContentResolver().query(Sms.CONTENT_URI,
new String[]{"thread_id from sms where type = 3 group by thread_id—"}, // 可以这样使用。
null, null, null);
07-17 10:55:17.084: E/AndroidRuntime(30157): FATAL EXCEPTION: main
07-17 10:55:17.084: E/AndroidRuntime(30157): java.lang.NullPointerException
07-17 10:55:17.084: E/AndroidRuntime(30157): at com.txrj.sms.activity.ConversationListActivity$LoadThreadsExtra.run(ConversationListActivity.java:181)
07-17 10:55:17.084: E/AndroidRuntime(30157): at android.os.Handler.handleCallback(Handler.java:605)
07-17 10:55:17.084: E/AndroidRuntime(30157): at android.os.Handler.dispatchMessage(Handler.java:92)
07-17 10:55:17.084: E/AndroidRuntime(30157): at android.os.Looper.loop(Looper.java:137)
07-17 10:55:17.084: E/AndroidRuntime(30157): at android.app.ActivityThread.main(ActivityThread.java:4517)
07-17 10:55:17.084: E/AndroidRuntime(30157): at java.lang.reflect.Method.invokeNative(Native Method)
07-17 10:55:17.084: E/AndroidRuntime(30157): at java.lang.reflect.Method.invoke(Method.java:511)
07-17 10:55:17.084: E/AndroidRuntime(30157): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
07-17 10:55:17.084: E/AndroidRuntime(30157): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
07-17 10:55:17.084: E/AndroidRuntime(30157): at dalvik.system.NativeStart.main(Native Method)
Cursor cursor = context.getContentResolver().query(Sms.CONTENT_URI,
new String[]{"thread_id"},
"type = 3 group by thread_id", null, null); // 不可以这样使用。
07-17 11:16:48.988: E/AndroidRuntime(32627): FATAL EXCEPTION: main
07-17 11:16:48.988: E/AndroidRuntime(32627): android.database.sqlite.SQLiteException: near "group": syntax error: , while compiling: SELECT thread_id FROM sms WHERE (type = 3 group by thread_id) ORDER BY date DESC
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:180)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.content.ContentProviderProxy.query(ContentProviderNative.java:358)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.content.ContentResolver.query(ContentResolver.java:311)
07-17 11:16:48.988: E/AndroidRuntime(32627): at com.txrj.sms.manager.SmsDataManager.getThreadsWithDraftMsg(SmsDataManager.java:33)
07-17 11:16:48.988: E/AndroidRuntime(32627): at com.txrj.sms.activity.ConversationListActivity$LoadThreadsExtra.run(ConversationListActivity.java:170)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.os.Handler.handleCallback(Handler.java:605)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.os.Handler.dispatchMessage(Handler.java:92)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.os.Looper.loop(Looper.java:137)
07-17 11:16:48.988: E/AndroidRuntime(32627): at android.app.ActivityThread.main(ActivityThread.java:4517)
07-17 11:16:48.988: E/AndroidRuntime(32627): at java.lang.reflect.Method.invokeNative(Native Method)
07-17 11:16:48.988: E/AndroidRuntime(32627): at java.lang.reflect.Method.invoke(Method.java:511)
07-17 11:16:48.988: E/AndroidRuntime(32627): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
07-17 11:16:48.988: E/AndroidRuntime(32627): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
07-17 11:16:48.988: E/AndroidRuntime(32627): at dalvik.system.NativeStart.main(Native Method)
Cursor cursor = context.getContentResolver().query(Sms.CONTENT_URI,
new String[]{"thread_id"},
"type = 3", null, "thread_id desc group by thread_id"); // 不可以这样使用。
07-17 11:20:57.040: E/AndroidRuntime(940): FATAL EXCEPTION: main
07-17 11:20:57.040: E/AndroidRuntime(940): android.database.sqlite.SQLiteException: near "group": syntax error: , while compiling: SELECT thread_id FROM sms WHERE (type = 3) ORDER BY thread_id desc group by thread_id
07-17 11:20:57.040: E/AndroidRuntime(940): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:180)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.content.ContentProviderProxy.query(ContentProviderNative.java:358)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.content.ContentResolver.query(ContentResolver.java:311)
07-17 11:20:57.040: E/AndroidRuntime(940): at com.txrj.sms.manager.SmsDataManager.getThreadsWithDraftMsg(SmsDataManager.java:33)
07-17 11:20:57.040: E/AndroidRuntime(940): at com.txrj.sms.activity.ConversationListActivity$LoadThreadsExtra.run(ConversationListActivity.java:170)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.os.Handler.handleCallback(Handler.java:605)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.os.Handler.dispatchMessage(Handler.java:92)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.os.Looper.loop(Looper.java:137)
07-17 11:20:57.040: E/AndroidRuntime(940): at android.app.ActivityThread.main(ActivityThread.java:4517)
07-17 11:20:57.040: E/AndroidRuntime(940): at java.lang.reflect.Method.invokeNative(Native Method)
07-17 11:20:57.040: E/AndroidRuntime(940): at java.lang.reflect.Method.invoke(Method.java:511)
07-17 11:20:57.040: E/AndroidRuntime(940): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
07-17 11:20:57.040: E/AndroidRuntime(940): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
07-17 11:20:57.040: E/AndroidRuntime(940): at dalvik.system.NativeStart.main(Native Method)
com.android.providers.telephony.SmsProvider.query(Uri, String[], String, String[], String)
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
null, null, orderBy);
-->
android.database.sqlite.SQLiteQueryBuilder.query(SQLiteDatabase, String[], String, String[], String, String, String)
public Cursor query(SQLiteDatabase db, String[] projectionIn,
String selection, String[] selectionArgs, String groupBy,
String having, String sortOrder) {
return query(db, projectionIn, selection, selectionArgs, groupBy, having, sortOrder,
null /* limit */);
}
-->
android.database.sqlite.SQLiteQueryBuilder.query(SQLiteDatabase, String[], String, String[], String, String, String, String)
public Cursor query(SQLiteDatabase db, String[] projectionIn,
String selection, String[] selectionArgs, String groupBy,
String having, String sortOrder, String limit) {
if (mTables == null) {
return null;
}
String sql = buildQuery(
projectionIn, selection, selectionArgs, groupBy, having,
sortOrder, limit);
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Performing query: " + sql);
}
return db.rawQueryWithFactory(
mFactory, sql, selectionArgs,
SQLiteDatabase.findEditTable(mTables));
}
-->
android.database.sqlite.SQLiteQueryBuilder.buildQuery(String[], String, String[], String, String, String, String)
public String buildQuery(
String[] projectionIn, String selection, String[] selectionArgs,
String groupBy, String having, String sortOrder, String limit) {
String[] projection = computeProjection(projectionIn);
StringBuilder where = new StringBuilder();
boolean hasBaseWhereClause = mWhereClause != null && mWhereClause.length() > 0;
if (hasBaseWhereClause) {
where.append(mWhereClause.toString());
where.append(')');
}
// Tack on the user's selection, if present.
if (selection != null && selection.length() > 0) {
if (hasBaseWhereClause) {
where.append(" AND ");
}
where.append('(');
where.append(selection);
where.append(')');
}
return buildQueryString(
mDistinct, mTables, projection, where.toString(),
groupBy, having, sortOrder, limit);
}
-->
android.database.sqlite.SQLiteQueryBuilder.buildQueryString(boolean, String, String[], String, String, String, String, String)
public static String buildQueryString(
boolean distinct, String tables, String[] columns, String where,
String groupBy, String having, String orderBy, String limit) {
if (TextUtils.isEmpty(groupBy) && !TextUtils.isEmpty(having)) {
throw new IllegalArgumentException(
"HAVING clauses are only permitted when using a groupBy clause");
}
if (!TextUtils.isEmpty(limit) && !sLimitPattern.matcher(limit).matches()) {
throw new IllegalArgumentException("invalid LIMIT clauses:" + limit);
}
StringBuilder query = new StringBuilder(120);
query.append("SELECT ");
if (distinct) {
query.append("DISTINCT ");
}
if (columns != null && columns.length != 0) {
appendColumns(query, columns);
} else {
query.append("* ");
}
query.append("FROM ");
query.append(tables);
appendClause(query, " WHERE ", where);
appendClause(query, " GROUP BY ", groupBy);
appendClause(query, " HAVING ", having);
appendClause(query, " ORDER BY ", orderBy);
appendClause(query, " LIMIT ", limit);
return query.toString();
}
-->
private static void appendClause(StringBuilder s, String name, String clause) {
if (!TextUtils.isEmpty(clause)) {
s.append(name);
s.append(clause);
}
}
class LoadThreadsExtra implements Runnable {
List<Integer> draftIds = null;
List<Integer> failIds = null;
Map<Integer, Integer> unreadMap = null;
Map<Integer, String> canonicalAddrMap = null;
Map<String, String> nameAddrMap = null;
@Override
public void run() {
draftIds = SmsDataManager.getThreadsWithDraftMsg(mContext);
failIds = SmsDataManager.getThreadsWithFailedMsg(mContext);
unreadMap = SmsDataManager.getThreadUnreadCountMap(mContext);
canonicalAddrMap = SmsDataManager.getCanonicalAddressMap(mContext);
nameAddrMap = SmsDataManager.getNameAddressMap(mContext);
int threadCount = mThreads.size();
for(int i=0;i<threadCount;i++){
TxrjThreads thread = mThreads.get(i);
long threadId = thread.getThreadId();
thread.setHasDraftMsg(draftIds.contains(threadId)); // draftIds是Integer类型的列表,而threadId是long类型。决定不可能返回true!
thread.setHasFailMsg(failIds.contains(threadId)); // 同上
thread.setUnReadCount(unreadMap.containsKey(threadId) ? unreadMap.get(threadId) : 0); // 同上
Log.i("txrjsms", "threadId:"+threadId+", hasDraftMsg:"+thread.isHasDraftMsg()
+", hasFailMsg:"+thread.isHasFailMsg()+", unread:"+thread.getUnReadCount());
}
mHandler.sendEmptyMessage(TxrjConstant.WHAT_NOTIFY_DATA_CHANGED);
}
}
07-17 11:58:20.379: I/txrjsms(2402): show data in listview.
07-17 11:58:21.470: I/txrjsms(2402): threadId:455, hasDraftMsg:false, hasFailMsg:true, unread:1
07-17 11:58:21.470: I/txrjsms(2402): threadId:459, hasDraftMsg:true, hasFailMsg:true, unread:0
07-17 11:58:21.470: I/txrjsms(2402): threadId:457, hasDraftMsg:false, hasFailMsg:false, unread:0
07-17 11:58:21.470: I/txrjsms(2402): threadId:458, hasDraftMsg:false, hasFailMsg:false, unread:0
07-17 11:58:21.470: I/txrjsms(2402): threadId:456, hasDraftMsg:false, hasFailMsg:false, unread:0
点击某个会话跳转到信息列表界面,没有显示任何信息出来。
查看代码定位到产生bug的原因是getIntent().getIntExtra()无法获取到long类型的threadId。
ConversationListActivity.java
it.putExtra(TxrjConstant.EXTRA_THREAD_ID, thread.getThreadId());
MessageListActivity.java
mThreadId = getIntent().getIntExtra(TxrjConstant.EXTRA_THREAD_ID, -1);
将getIntExtra改成getLongExtra。如下。
mThreadId = getIntent().getLongExtra(TxrjConstant.EXTRA_THREAD_ID, -1);
ContentResolver.query()—>buildQueryString()的更多相关文章
- Android:联系人Contacts之ContentResolver query 参数详解
注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...
- [ 原创 ]学习笔记-Android 学习笔记 Contacts (一)ContentResolver query 参数详解 [转载]
此博文转载自:http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NA ...
- ContentProvider官方教程(3)ContentResolver查询、遍历 示例
Retrieving Data from the Provider This section describes how to retrieve data from a provider, using ...
- 使用ContentResolver添加数据、查询数据
import java.util.ArrayList;import java.util.HashMap;import java.util.Map; import android.os.Bundle;i ...
- ContentProvider与ContentResolver使用【转】
这篇文章被转载而转载者未注明原文出处,在此未加上原文地址链接,本人向原作者致以歉意. 下面是文章内容: 使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写 ...
- managedQuery和query的区别,
我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供Content Provider,可以帮助那些不会SQL语言的开发者快速实现Android平台上的数据库操作,但是平时 ...
- ContentProvider与ContentResolver使用
例如以下内容为从网络转载: 使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就能够向其它应用共享其数据.虽然使用其它方 ...
- ContentResolver + SqliteOpenHelper + ContentProvider 理解
惭愧,现在才接触到ContentResolver的用法 这个类主要是Android用来实现应用程序之间数据共享的 一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的 ...
- android利用ContentResolver访问者获取手机联系人信息
转载自:http://www.jb51.net/article/106379.htm 首先需要在AndroidManifest.xml文件中添加权限: <uses-permission andr ...
随机推荐
- QT TCP网络编程
首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.相比而言UDP,就是开放式.无连接.不可靠的传输层 ...
- 我眼中的SCRUM
回顾一下我所认识的scrum,算是对自己知识的一个梳理. scrum到底是什么,书中都说,它不是方法学,不是过程,而是一个框架.我并没有太理解这句话,所以先把scrum中都有些什么来说一下(可跟前一篇 ...
- [leetcode]Permutations @ Python
原题地址:https://oj.leetcode.com/problems/permutations/ 题意: Given a collection of numbers, return all po ...
- Spring Boot 直接用jar运行项目
概述 在Spring Boot 开篇-创建和运行一文中,介绍了如何创建一个Sprint Boot项目并且运行起来.但是运行的方式是在IDEA中直接Run起来的.还有另一中方式可以可以把Spring B ...
- HTML5基础扩展——地理位置、本地存储、缓存
HTML5扩展,继上两篇博客,我们来看一下HTML5的一些扩展的功能,由于HTML5更多是为了兼容电脑浏览器,安卓浏览器,苹果浏览器更多浏览器,或者说为这些浏览器提供一个统一的标准.因此目前在手机上的 ...
- Google Guava新手教程
以下资料整理自网络 一.Google Guava入门介绍 引言 Guavaproject包括了若干被Google的 Java项目广泛依赖 的核心库,比如:集合 [collections] . ...
- 【Eclipse】Eclipse-Build-缓慢-卡住
Eclipse-Build-缓慢-卡住 eclipse building workspace 卡主_百度搜索 解决building workplace 导致的卡死,使得eclipse加速 - CSDN ...
- 3D打印机开源、免费分层软件介绍
分层软件,就是把3D模型按照层厚设置按照Z轴方向分层,并得到G代码,供设备使用.基本上3D打印机都自带了控制软件,对于想自己开发3D打印机的朋友来说,已经有很多国外的免费或者开源的分层软件可以直接使用 ...
- Anroid 解决小米和魅族不能在mac上调试
第一种方法 1.mac->关于本机->系统报告->usb->copy厂商ID** 2.cmd->echo " 0x2a45" >> ~/. ...
- 推荐一些socket工具,TCP、UDP调试、抓包工具
还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...