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

Content Resolver throws Null Pointer Exception while inserting into DATA.CONTENT_URI

我正在使用以下代码在 Android 联系人中添加自定义 Mimetype。此代码在下面的行中抛出错误

getContentResolver().insert(ContactsContract.Data.CONTENT_URI, 值);

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;
    }

我已经从 Whosebug 复制了这段代码 post 但是它不起作用。有人可以向我解释它抛出此错误的原因。

不能保证这会解决您的问题,因为您还没有 post 完整的堆栈跟踪,但一般来说,您不能通过 CONTACT_IDContactsContract 数据库是这样工作的:

  1. Contacts - 每个条目代表一个联系人,并将一个或多个 RawContacts
  2. 组合在一起
  3. RawContacts - 每个条目代表有关联系人的数据,这些数据由某些 SyncAdapter(例如 Whatsapp、Google、Facebook、Viber)同步,这将多个数据条目分组
  4. Data - 有关联系人、电子邮件、电话等的实际数据。每行是属于单个 RawContact
  5. 的单个数据

因此,在添加数据行时,您必须通过 Data.RAW_CONTACT_ID = ... 指定确切的 RawContact._ID,无需指定 CONTACT_ID,因为 [=18] =] 已经属于一些 Contact

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

旁注:

  • 报告崩溃时,总是post你的完整堆栈跟踪
  • 将您的代码减少到显示崩溃的最少代码,这样从您的方法返回 Activity 等其他内容就不会混淆