Android 内容解析器在插入DATA.Content\u URI时引发空指针异常

Android 内容解析器在插入DATA.Content\u URI时引发空指针异常,android,android-contentprovider,android-contacts,contactscontract,Android,Android Contentprovider,Android Contacts,Contactscontract,我使用下面的代码在Android联系人中添加自定义Mimetype。此代码在下面的行中抛出错误 getContentResolver().insert(ContactsContract.Data.CONTENT\u URI,值) java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“long java.lang.long.longValue()” public static final String MIMETYPE_FORMALITY = "vnd.and

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

getContentResolver().insert(ContactsContract.Data.CONTENT\u 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;
    }

我从Stackoverflow post复制了这段代码,但它不起作用。有人能解释一下它抛出这个错误的原因吗

无法保证这会解决您的问题,因为您尚未发布完整的堆栈跟踪,但一般来说,您无法将行插入到
数据中。CONTENT\u URI
通过
CONTACT\u ID
contacts contract
数据库的工作方式如下:

  • 联系人
    -每个条目代表一个联系人,并将一个或多个
    联系人分组
  • RawContacts
    -每个条目表示由某些
    SyncAdapter
    (例如Whatsapp、Google、Facebook、Viber)同步的联系人的数据,这将多个数据条目分组
  • 数据
    -关于联系人、电子邮件、电话等的实际数据。每一行都是属于单个
    联系人的一段数据
  • 因此,在添加数据行时,您必须指定确切的RawContact。\它将通过
    Data.RAW\u CONTACT\u ID=…
    进入,无需指定
    CONTACT\u ID
    ,因为
    RawContact
    已经属于某个
    CONTACT

    这也是对现有数据进行更新的相同方法

    作为旁注:

    • 报告崩溃时,始终发布完整堆栈跟踪
    • 将代码减少到显示崩溃的最小代码,这样其他内容(如从方法返回活动)就不会混淆

    公共主活动保存形式()??返回活动实例的公共函数?或者是什么?会发生什么?您在哪个类中使用此代码?
    从Stackoverflow post复制了此代码。当然,你应该发布一个链接。也许你用错代码了。我们想查一查,非常感谢。由于我使用的联系人ID,这一切都搞砸了。原始联系人ID解决了我的问题。非常感谢。