【问题标题】:performFiltering() sql exception while filtering android.过滤android时执行过滤()sql异常。
【发布时间】:2015-06-01 15:29:57
【问题描述】:

我正在尝试过滤 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);
        }

这里是例外

  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()+"%";
  • 为什么要将ContactsContract.Contacts.HAS_PHONE_NUMBER 添加到您的选择中
  • 那么我怎样才能通过选择谁有电话号码并且他们的名字以用户的输入开头?总之如何过滤联系人?
  • 因为我只想检索那些有电话号码的联系人。

标签: android listview android-listview android-sqlite


【解决方案1】:

而不是使用

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()+"%'";

这样可以解决问题

【讨论】:

  • 但它可能会给出所有没有电话号码的结果,就像它会给出电子邮件 ID 一样。我说的对吗?
  • 查看我编辑的答案而不是 phone_number 您可以输入您的实体名称
  • 顺便说一句,我试过这个,但我仍然得到这个 sql 异常 (status_update_id=contacts_status_updates.status_update_data_id) WHERE ((1)) AND ((display_name like %abc%))
  • 你添加了phone_number =
  • 在你更新后得到 sqlException near% ((phone_number=has_phone_number and display_name like %a%
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多