【发布时间】:2021-10-20 15:46:25
【问题描述】:
所以我正在开发一个应用程序,我做的第一件事就是创建一个联系人列表结构。这是我作为教程开始的视频:https://www.youtube.com/watch?v=esDWSfBa-oc
一切都很顺利,直到我遇到一个错误,只能通过将cursor.getColumnIndex() 更改为cursor.getColumnIndexOrThrow() 来修复,如下面的(MainActivity)代码所示:
private void getContactList() {
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String sort = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME+"ASC";
Cursor cursor = getContentResolver().query(
uri, null, null, null, sort
);
if (cursor.getCount() > 0){
while (cursor.moveToNext()){
String id = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.Contacts._ID
));
String name = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.Contacts.DISPLAY_NAME
));
Uri uriPhone = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String selection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " =?";
Cursor phoneCursor = getContentResolver().query(
uriPhone, null, selection,
new String[]{id}, null
);
if (phoneCursor.moveToNext()){
String number = phoneCursor.getString(phoneCursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.Phone.NUMBER
));
ContactModel model = new ContactModel();
model.setName(name);
model.setNumber(number);
arrayList.add(model);
phoneCursor.close();
}
}
cursor.close();
}
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MainAdapter(this,arrayList);
recyclerView.setAdapter(adapter);
}
如果我删除 cursor.getColumnIndexOrThrow() 中的“OrThrow”指示,它会给我一个没有可见修复的错误,告诉我在线寻求反馈。考虑到我所做的一切都与视频中的完全一样,并且任何错误都是由于我尚未发现的一些错字或应用程序本身在库或预设调整方面有所不同,这很奇怪,我不确定全部。
观看完整视频并完成初始应用程序结构后,应用程序无法打开,并且在重新观看视频并认为我不得不拒绝联系人访问后(实际上并非如此,视频是只是显示如果我们拒绝允许访问会发生什么,因为显然需要联系人访问),它会起作用,但它当然不会显示联系人。
logcat 中的错误:
2021-10-18 17:43:21.130 12998-12998/com.example.wolfix E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wolfix, PID: 12998
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wolfix/com.app.wolfix.MainActivity}: android.database.sqlite.SQLiteException: no such column: display_nameASC (code 1 SQLITE_ERROR): , while compiling: SELECT 0 AS last_time_contacted, phonetic_name, custom_ringtone, contacts_status_updates.status_ts AS contact_status_ts, pinned, photo_id, photo_file_id, contacts_status_updates.status_res_package AS contact_status_res_package, agg_presence.chat_capability AS contact_chat_capability, contacts_status_updates.status_icon AS contact_status_icon, display_name_alt, sort_key_alt, in_visible_group, starred, contacts_status_updates.status_label AS contact_status_label, phonebook_label, is_user_profile, has_phone_number, display_name_source, phonetic_name_style, send_to_voicemail, lookup, phonebook_label_alt, contact_last_updated_timestamp, photo_uri, phonebook_bucket, contacts_status_updates.status AS contact_status, display_name, sort_key, photo_thumb_uri, agg_presence.mode AS contact_presence, in_default_directory, 0 AS times_contacted, _id, name_raw_contact_id, phonebook_bucket_alt FROM view_contacts LEFT OUTER JOIN agg_presence ON (_id = agg_presence.presence_contact_id) LEFT OUTER JOIN status_updates contacts_status_updates ON (status_update_id=contacts_status_updates.status_update_data_id) WHERE ((1)) ORDER BY display_nameASC
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.database.sqlite.SQLiteException: no such column: display_nameASC (code 1 SQLITE_ERROR): , while compiling: SELECT 0 AS last_time_contacted, phonetic_name, custom_ringtone, contacts_status_updates.status_ts AS contact_status_ts, pinned, photo_id, photo_file_id, contacts_status_updates.status_res_package AS contact_status_res_package, agg_presence.chat_capability AS contact_chat_capability, contacts_status_updates.status_icon AS contact_status_icon, display_name_alt, sort_key_alt, in_visible_group, starred, contacts_status_updates.status_label AS contact_status_label, phonebook_label, is_user_profile, has_phone_number, display_name_source, phonetic_name_style, send_to_voicemail, lookup, phonebook_label_alt, contact_last_updated_timestamp, photo_uri, phonebook_bucket, contacts_status_updates.status AS contact_status, display_name, sort_key, photo_thumb_uri, agg_presence.mode AS contact_presence, in_default_directory, 0 AS times_contacted, _id, name_raw_contact_id, phonebook_bucket_alt FROM view_contacts LEFT OUTER JOIN agg_presence ON (_id = agg_presence.presence_contact_id) LEFT OUTER JOIN status_updates contacts_status_updates ON (status_update_id=contacts_status_updates.status_update_data_id) WHERE ((1)) ORDER BY display_nameASC
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:186)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:472)
at android.content.ContentResolver.query(ContentResolver.java:1183)
at android.content.ContentResolver.query(ContentResolver.java:1115)
2021-10-18 17:43:21.130 12998-12998/com.example.wolfix E/AndroidRuntime: at android.content.ContentResolver.query(ContentResolver.java:1071)
at com.app.wolfix.MainActivity.getContactList(MainActivity.java:52)
at com.app.wolfix.MainActivity.checkPermission(MainActivity.java:43)
at com.app.wolfix.MainActivity.onCreate(MainActivity.java:33)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
... 11 more
我试过了:
- 在模拟器中添加联系人(找不到方法,当我尝试连接到我的 Google 帐户时,它仍然不允许我访问联系人);
- 以编程方式添加联系人(即使这样也行不通,可能也与联系人访问有关);
- 重新访问代码,特别是前面提到的“OrThrow”事件部分,看看这是否与它有关;
- 检查问题是否出在模拟器本身(无法得出任何结论)。
我仍然认为问题出在模拟器上,我只是不知道如何修复它。
我对编程世界并不陌生,我只是在做一个学校项目,而我正在使用的应用程序 Android Studio 仍然是我正在学习和适应的东西。
任何帮助都将不胜感激,即使错误出在代码或仿真软件中,我希望您理解我仍然不完全喜欢它。如果需要更多代码,我可以这样做,但是,就像我说的,大部分代码都取自这个视频:https://www.youtube.com/watch?v=esDWSfBa-oc,所以这里有什么,当然除了前面提到的变化。
提前致谢!
【问题讨论】:
-
请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。
标签: java android android-studio