android - android.performFiltering() 过滤时出现 sql 异常。

标签 android listview android-listview android-sqlite

我正在尝试过滤 SimpleCursorAdapter ListView 但我在过滤时遇到 sql 异常。 我试图找到那些名字以用户输入的文本开头的联系人。

 String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";
            cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selection, null, null);


 adapter.setFilterQueryProvider(new FilterQueryProvider() {
                public Cursor runQuery(CharSequence constraint) {
                    return getDirectoryList(constraint);
                }
            });


 inputSearch.addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                    // When user changed the Text
                    Toast.makeText(getApplicationContext(), "changing now"+cs
                            , Toast.LENGTH_LONG).show();
                    MyActivity.this.adapter.getFilter().filter(cs);
                }
  });

   public Cursor getDirectoryList (CharSequence constraint)  {
            String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " display_name like %"+constraint.toString()+"%";
            return getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selection, null, null);
        }

这里是异常(exception)

  An exception occured during performFiltering()!
android.database.sqlite.SQLiteException: near "display_name": syntax error (code 1): , while compiling: SELECT sort_key, photo_uri, send_to_voicemail, contacts_status_updates.status AS contact_status, contacts_status_updates.status_label AS contact_status_label, pinned, display_name, phonebook_label_alt, phonebook_bucket, contacts_status_updates.status_res_package AS contact_status_res_package, in_default_directory, photo_id, custom_ringtone, _id, times_contacted, phonebook_label, display_name_alt, lookup, phonetic_name, last_time_contacted, contact_last_updated_timestamp, has_phone_number, in_visible_group, display_name_source, photo_file_id, is_user_profile, contacts_status_updates.status_ts AS contact_status_ts, sort_key_alt, phonebook_bucket_alt, agg_presence.mode AS contact_presence, starred, photo_thumb_uri, contacts_status_updates.status_icon AS contact_status_icon, agg_presence.chat_capability AS contact_chat_capability, phonetic_name_style, name_raw_contact_id 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)) AND ((has_phone_number display_name like %ab%))
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
        at android.content.ContentResolver.query(ContentResolver.java:478)
        at android.content.ContentResolver.query(ContentResolver.java:422)
        at com.websmithing.gpstracker.GpsTrackerActivity.getDirectoryList(GpsTrackerActivity.java:189)
        at com.websmithing.gpstracker.GpsTrackerActivity$2.runQuery(GpsTrackerActivity.java:128)
        at android.widget.CursorAdapter.runQueryOnBackgroundThread(CursorAdapter.java:395)
        at android.widget.CursorFilter.performFiltering(CursorFilter.java:49)
        at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.os.HandlerThread.run(HandlerThread.java:61)

最佳答案

而不是使用

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " display_name like %"+constraint.toString()+"%";

使用

String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " and display_name like '%"+constraint.toString()+"%'";

这可能会解决问题

关于android - android.performFiltering() 过滤时出现 sql 异常。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30577408/

相关文章:

android - 使用 View.GenerateViewId 创建 ID 时如何查找带 ID 的 TextView

java - Android ListView 从数据库记录实现的问题

android - 如何在警报对话框android中添加自定义ListView

android - 为什么我开发的Android应用程序保存在内存中?

android - Android 应用程序是否仍需要包含扩展文件下载器?

android - 如何从 Android 应用程序运行 root 命令?

java - 未部署单独的手机和平板电脑 XML 布局

Android:如何永久修改 ListView 的子项(View)-滚动后颜色丢失

java - 当 ListView 只有几个项目时,如何使警报对话框显示 ListView 的所有项目?

java - 如何不再加载所有 ListView 项目?