ContentResolver查询抛出了空指针异常。

6

我正在一个已root的Android 2.3.3 htc incredible S上编写一款MMS/SMS应用程序,使用了sense 2.1。 现在,在尝试接收某个联系人SMS/MMS列表时,查询会导致FC。

以下是相关代码:

Uri uri = Uri.parse("content://mms-sms/conversations/"+String.valueOf(thread_id));
ContentResolver cr = context.getContentResolver();
Cursor c= cr.query(uri,null,null,null,null);    //crashing here

日志记录:

05-22 15:24:24.273: E/AndroidRuntime(32087): FATAL EXCEPTION: main
05-22 15:24:24.273: E/AndroidRuntime(32087): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.uiu.messaging/com.uiu.messaging.ContactMessageChain}: java.lang.NullPointerException
05-22 15:24:24.273: E/AndroidRuntime(32087): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.app.ActivityThread.access$1500(ActivityThread.java:132)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.os.Looper.loop(Looper.java:143)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.app.ActivityThread.main(ActivityThread.java:4196)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at java.lang.reflect.Method.invokeNative(Native Method)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at java.lang.reflect.Method.invoke(Method.java:507)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at dalvik.system.NativeStart.main(Native Method)
05-22 15:24:24.273: E/AndroidRuntime(32087): Caused by: java.lang.NullPointerException
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.os.Parcel.readException(Parcel.java:1328)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.content.ContentProviderProxy.query(ContentProviderNative.java:408)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.content.ContentResolver.query(ContentResolver.java:264)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at com.uiu.messaging.Data.getContactChain(Data.java:319)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at com.uiu.messaging.ContactMessageChain.onCreate(ContactMessageChain.java:138)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
05-22 15:24:24.273: E/AndroidRuntime(32087):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
05-22 15:24:24.273: E/AndroidRuntime(32087):    ... 11 more

所有权限均已考虑到。

非常感谢任何帮助。

编辑:

按照Mike的建议后,我在logcat中收到以下错误:

05-22 16:31:46.178: E/AndroidRuntime(1892): FATAL EXCEPTION: main
05-22 16:31:46.178: E/AndroidRuntime(1892): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.uiu.messaging/com.uiu.messaging.ContactMessageChain}: android.database.sqlite.SQLiteException: near "*": syntax error: , while compiling: SELECT * FROM (SELECT DISTINCT date * 1 AS normalized_date, NULL AS * FROM sms WHERE (htc_category= 0 AND thread_id = 25 AND (type != 3 AND type > 0)) UNION SELECT DISTINCT date * 1000 AS normalized_date, NULL AS * FROM pdu LEFT JOIN pending_msgs ON pdu._id = pending_msgs.msg_id WHERE (htc_category= 0 AND thread_id = 25 AND msg_box != 3 AND (msg_box > 0 AND msg_box != 3 AND (m_type = 128 OR m_type = 132 OR m_type = 130))) ORDER BY normalized_date ASC)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1816)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1837)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.ActivityThread.access$1500(ActivityThread.java:132)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1033)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.os.Looper.loop(Looper.java:143)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.ActivityThread.main(ActivityThread.java:4196)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at java.lang.reflect.Method.invokeNative(Native Method)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at java.lang.reflect.Method.invoke(Method.java:507)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at dalvik.system.NativeStart.main(Native Method)
05-22 16:31:46.178: E/AndroidRuntime(1892): Caused by: android.database.sqlite.SQLiteException: near "*": syntax error: , while compiling: SELECT * FROM (SELECT DISTINCT date * 1 AS normalized_date, NULL AS * FROM sms WHERE (htc_category= 0 AND thread_id = 25 AND (type != 3 AND type > 0)) UNION SELECT DISTINCT date * 1000 AS normalized_date, NULL AS * FROM pdu LEFT JOIN pending_msgs ON pdu._id = pending_msgs.msg_id WHERE (htc_category= 0 AND thread_id = 25 AND msg_box != 3 AND (msg_box > 0 AND msg_box != 3 AND (m_type = 128 OR m_type = 132 OR m_type = 130))) ORDER BY normalized_date ASC)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:408)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.content.ContentResolver.query(ContentResolver.java:264)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at com.uiu.messaging.Data.getContactChain(Data.java:318)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at com.uiu.messaging.ContactMessageChain.onCreate(ContactMessageChain.java:138)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
05-22 16:31:46.178: E/AndroidRuntime(1892):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1780)
05-22 16:31:46.178: E/AndroidRuntime(1892):     ... 11 more

我不知道SQL语句有什么问题...

1
通常情况下,从logcat中附加堆栈跟踪是明智的。 - Jens
在调用查询之前,uri的值是多少? - MikeIsrael
1
如上所述,thread_id是一个长整型。 - zwebie
这似乎在搭载 Android 4.3 的 Galaxy Note 2 上崩溃了。错误信息是“Caused by: android.database.sqlite.SQLiteException: no such column: normalized_date (code1): , while compiling: SELECT * FROM threads ORDER BY normalized_date desc”。你如何确定 normalized_date 列不存在?我已在其他版本的 Android 上进行了测试,没有任何问题。 - Etienne Lawlor
2个回答

4

好的,问题已经解决了。诀窍在于将实际列名输入到投影中。看起来 bug 确实是由 Android 引起的。


1

根据另一个答案,第二个参数不应该为空(尽管文档说这是有效的值),请尝试

final String[] projection = new String[]{"*"};
Cursor query = contentResolver.query(uri, projection, null, null, null);

原始帖子


这是不正确的。文档指出projection参数是“要放入游标中的列列表。如果为null,则包含所有列。” - Alex Lockwood
我以前使用过ContentProvider,并可以向您保证,这不是文档中的错误...传递null是完全可以接受的。 - Alex Lockwood
我不确定为什么你发布的那个问题说你需要传递 *...这种 SQL 语法大多由 Android SDK 抽象化了。 - Alex Lockwood
@AlexLockwood,正如我在答案中提到的那样,它基于 SO 上的另一篇帖子,他们声称第二个参数不能为 null,尽管文档声称它可以为 null。 - MikeIsrael
好吧,看起来用户的回答似乎有所帮助,那我们就同意各自保留不同的观点。 - MikeIsrael
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接