【发布时间】:2021-10-09 11:11:36
【问题描述】:
我正在编写一个应用程序,让用户可以从他们的 Android 设备中删除联系人并将它们存储在单独的数据库中。他们也应该能够将联系人恢复到他们的手机,但我在这部分遇到了麻烦。我从我的数据库中检索联系人信息并创建一个联系人对象,其中包含联系人 ID、查找键、结构化名称、组织、电话对象的数组列表(包含电话号码和类型)等。一切都在那里。我将该信息恢复到手机的功能如下所示:
public void addContact(Contact contact)
{
ContentValues values = new ContentValues();
values.put("contact_id", contact.getContactId());
values.put("lookup", contact.getLookupKey());
values.put("mimetype", StructuredName.CONTENT_ITEM_TYPE);
values.put("data1", contact.getStructuredName().getDisplayName());
values.put("data2", contact.getStructuredName().getGivenName());
values.put("data3", contact.getStructuredName().getFamilyName());
values.put("data4", contact.getStructuredName().getPrefix());
values.put("data5", contact.getStructuredName().getMiddleName());
values.put("data6", contact.getStructuredName().getSuffix());
context.getContentResolver().insert(Data.CONTENT_URI, values);
}
而且,这就是应用程序崩溃的地方。我使用这种方法将数据插入到我的数据库中没有任何问题,并且我可以验证它是否被正确存储。所以我的猜测是有比这更好的方法将联系人插入设备,但我不知道那会是什么。有人可以给我一个以编程方式创建联系人并将其插入用户设备的示例吗?即使我可以看到只创建了显示名称的联系人,我也会感到满意。
以防万一,我也尝试将此代码放在结构化名称的插入上方,但无济于事:
values.put("_id", contact.getContactId());
values.put("lookup", contact.getLookupKey());
values.put("display_name", contact.getStructuredName().getDisplayName());
context.getContentResolver().insert(Contacts.CONTENT_URI, values);
values.clear();
编辑:这是应用程序崩溃时的 logcat 错误日志:
05-07 20:31:53.941: E/Trace(819): error opening trace file: No such file or directory (2)
05-07 20:34:39.035: D/AndroidRuntime(853): Shutting down VM
05-07 20:34:39.048: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
05-07 20:34:39.197: E/AndroidRuntime(853): FATAL EXCEPTION: main
05-07 20:34:39.197: E/AndroidRuntime(853): java.lang.NullPointerException
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Parcel.readException(Parcel.java:1431)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentResolver.insert(ContentResolver.java:866)
05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:58)
05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.StartPage$12.onClick(StartPage.java:542)
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Looper.loop(Looper.java:137)
05-07 20:34:39.197: E/AndroidRuntime(853): at android.app.ActivityThread.main(ActivityThread.java:5041)
05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invokeNative(Native Method)
05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invoke(Method.java:511)
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-07 20:34:39.197: E/AndroidRuntime(853): at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
-
如果它崩溃了,日志中应该有一个堆栈跟踪。请张贴logcat。
-
呃,我不确定要发布哪个部分。 logcat中弹出一堆错误,所以这里是前几个:
05-07 09:07:02.334: E/Trace(3052): error opening trace file: No such file or directory (2)05-07 09:07:21.483: E/AndroidRuntime(3052): FATAL EXCEPTION: main05-07 09:07:21.483: E/AndroidRuntime(3052): java.lang.NullPointerException05-07 09:07:21.483: E/AndroidRuntime(3052): at android.os.Parcel.readException(Parcel.java:1431)05-07 09:07:21.483: E/AndroidRuntime(3052): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) -
关于
NullPointerException的部分是要发布的。编辑您的问题并添加 full 堆栈跟踪,而不仅仅是前两行。 -
好的,我添加了完整的堆栈跟踪。我希望这会有所帮助。 @AleksG
标签: android