内容解析器在插入 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_ID
,ContactsContract
数据库是这样工作的:
Contacts
- 每个条目代表一个联系人,并将一个或多个 RawContacts
组合在一起
RawContacts
- 每个条目代表有关联系人的数据,这些数据由某些 SyncAdapter
(例如 Whatsapp、Google、Facebook、Viber)同步,这将多个数据条目分组
Data
- 有关联系人、电子邮件、电话等的实际数据。每行是属于单个 RawContact
的单个数据
因此,在添加数据行时,您必须通过 Data.RAW_CONTACT_ID = ...
指定确切的 RawContact._ID,无需指定 CONTACT_ID
,因为 [=18] =] 已经属于一些 Contact
这与更新现有数据的方式相同。
旁注:
- 报告崩溃时,总是post你的完整堆栈跟踪
- 将您的代码减少到显示崩溃的最少代码,这样从您的方法返回 Activity 等其他内容就不会混淆
我正在使用以下代码在 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_ID
,ContactsContract
数据库是这样工作的:
Contacts
- 每个条目代表一个联系人,并将一个或多个RawContacts
组合在一起
RawContacts
- 每个条目代表有关联系人的数据,这些数据由某些SyncAdapter
(例如 Whatsapp、Google、Facebook、Viber)同步,这将多个数据条目分组Data
- 有关联系人、电子邮件、电话等的实际数据。每行是属于单个RawContact
的单个数据
因此,在添加数据行时,您必须通过 Data.RAW_CONTACT_ID = ...
指定确切的 RawContact._ID,无需指定 CONTACT_ID
,因为 [=18] =] 已经属于一些 Contact
这与更新现有数据的方式相同。
旁注:
- 报告崩溃时,总是post你的完整堆栈跟踪
- 将您的代码减少到显示崩溃的最少代码,这样从您的方法返回 Activity 等其他内容就不会混淆