在将自定义字段插入"联系人数据"表时,如何跟踪哪个字段导致NullPointerException?

Pen*_*m10 5 java android

我得到的完整例外是:

07-16 19:19:17.244: ERROR/DatabaseUtils(151): java.lang.NullPointerException
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at com.android.providers.contacts.ContactsProvider2.insertData(ContactsProvider2.java:3069)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:2930)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at com.android.providers.contacts.CContactsProvider2.insertInTransaction(CContactsProvider2.java:156)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at com.android.providers.contacts.HtcContactsProvider2.insertInTransaction(HtcContactsProvider2.java:1281)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at com.android.providers.contacts.SQLiteContentProvider.insert(SQLiteContentProvider.java:90)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2737)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at android.content.ContentProvider$Transport.insert(ContentProvider.java:150)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:170)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at android.os.Binder.execTransact(Binder.java:287)
07-16 19:19:17.244: ERROR/DatabaseUtils(151):     at dalvik.system.NativeStart.run(Native Method)
Run Code Online (Sandbox Code Playgroud)

我使用的代码是:

public void saveFormality() {
    ContentValues values = new ContentValues();
    values.put(Data.DATA1, this.getFormality() ? "1" : "0");
    saveDataWithMimeType(clsContacts.MIMETYPE_FORMALITY, values, this.getId());
}


private void saveDataWithMimeType(String mimetype, ContentValues values, String contactid) {
    try {
        int mod = ctx.getContentResolver().update(
                Data.CONTENT_URI,
                values,
                ContactsContract.Data.RAW_CONTACT_ID + "=" + contactid + " AND " + ContactsContract.Data.MIMETYPE + "= '"
                        + mimetype + "'", null);

        if (mod == 0) {
            values.put(Data.RAW_CONTACT_ID, contactid);
            values.put(Data.MIMETYPE, mimetype);
            // this is where exception occurs
            Uri u=ctx.getContentResolver().insert(Data.CONTENT_URI, values);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

这只发生在手机上,而不是在模拟器中.检查了所有字段,但没有一个是空值.可能是什么原因?

Reu*_*ton 10

通过在原始数据中寻找手动添加的联系人的庞大过程来计算出来,然后通过反复试验来确定内容提供商坚持要求的数据.这很简单:

插入新电话记录时,必须指定Data.Type(名为"data2"的列).如果您不指定此项,HTC的Contacts ContentProvider将因NullPointerException而崩溃.股票Android Contacts ContentProvider不会崩溃,它只是默认为TYPE_OTHER.

该死的和(一)实施不同的联系人的ContentProvider,它爆炸HTC 没有被记录的规则行事,和(b)只释放内核源代码.我们需要HtcContactsProvider2.java来查看他们的代码认为问题是什么.


Aar*_*lla -1

将线分成ContactsProvider2.java:3069几条仅包含一个点的线。这样,行号将匹配单个字段取消引用,这将直接告诉您哪个字段是null