内容解析器在插入DATA.CONTENT_URI时抛出空指针异常

时间:2018-03-16 22:54:58

标签: android android-contentprovider android-contacts contactscontract

我使用以下代码在Android通讯录中添加自定义Mimetype。此代码在下面的行中引发错误

getContentResolver()。insert(ContactsContract.Data.CONTENT_URI,values);

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'long java.lang.Long.longValue()'

public static final String MIMETYPE_FORMALITY = "vnd.android.cursor.item/ABCAPPLICATION";
    public MainActivity saveFormality() {

            ContentValues values = new ContentValues();
            values.put(ContactsContract.Data.DATA1, this.getFormality() ? "1" : "0");
            int mod = getContentResolver().update(
                    ContactsContract.Data.CONTENT_URI,
                    values,
                    ContactsContract.Data.CONTACT_ID + "=" + "2231" + " AND "
                            + ContactsContract.Data.MIMETYPE + "= '"
                            + MIMETYPE_FORMALITY + "'", null);

            if (mod == 0) {
                values.put(ContactsContract.Data.CONTACT_ID, Long.valueOf("2231"));
                values.put(ContactsContract.Data.MIMETYPE, MIMETYPE_FORMALITY);
                **getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);** // This line was throwing null pointer exception. 

                Log.v("mimeType", "Inserted");
            }
        return this;
    }

我已经从Stackoverflow帖子中复制了这段代码但是它没有用。有人可以解释为什么它会抛出这个错误。

1 个答案:

答案 0 :(得分:1)

不能保证这会解决您的问题,因为您尚未发布完整的堆栈跟踪,但通常情况下,您无法通过Data.CONTENT_URI CONTACT_IDContactsContract插入行。 {1}} DB的工作方式如下:

  1. Contacts - 每个条目代表一个联系人,并将一个或多个RawContacts
  2. 组合在一起
  3. RawContacts - 每个条目代表有关某些SyncAdapter(例如Whatsapp,Google,Facebook,Viber)同步的联系人的数据,此组合包含多个数据条目
  4. Data - 有关联系人,电子邮件,电话等的实际数据,每一行都是属于单个RawContact的单个数据
  5. 因此,在添加数据行时,您必须通过Data.RAW_CONTACT_ID = ...指定它将进入的确切RawContact._ID,无需指定CONTACT_ID,因为RawContact已属于某些Contact

    这与对现有数据进行更新的方式相同。

    作为旁注:

    • 报告崩溃时,请始终发布完整的堆栈跟踪
    • 将代码缩减到显示崩溃的最小代码,因此从方法返回活动等其他内容不会混淆